而不是使用正则表达式在这里你应该分析的实用功能为您的特殊格式字符串,它们是简单的,他们不采取长写的,他们会让你的生活轻松了许多:
function readPath($path) {
$parameters = array();
foreach(explode('/', $path) as $piece) {
// Here we make sure we have something
if ($piece == "") {
continue;
}
// This here is just a fancy way of splitting the array returned
// into two variables.
list($key, $value) = explode(':', $piece);
$parameters[$key] = $value;
}
return $parameters;
}
function writePath($parameters) {
$path = "";
foreach($parameters as $key => $value) {
$path .= "/" . implode(":", array($key, $value));
}
return $path;
}
现在你可以在它刚刚工作作为一个PHP数组,在这种情况下,你会去:
$parameters = readPath($string);
unset($parameters['st']);
$string = writePath($parameters);
这使得更可读和可重用的代码,还因为大多数的时候,你正在处理的只有轻微的变化这种格式你可以改变分隔符每次甚至将这些函数抽象为使用不同的分隔符。
另一种方式来处理这是符合正常的路径查询字符串转换,使用类似:
function readPath($path) {
return parse_str(strtr($path, "/:", "&="));
}
你的情况,但由于您使用的是“=”字符在一个url中,你也需要对每个值进行url编码,以免与格式冲突,但是这会涉及类似于上面的结构化代码。
谢谢。如果想要匹配这个模式,当它发生在字符串的手中时?如in/sc:r2342/st:1 – giuseppe
找到。 /st:(.*?)\/|\/st:(.*?)$/ – giuseppe
正如我在我的回答中指出的那样,懒惰匹配 - '。*?' - 不推荐使用,因为它会影响性能,并可能会超过。也许情况并非如此,在这种情况下更多的是风格问题,但这是一个重要的说明。另外,我宁愿接受首先给出的正确答案。 –