我必须修改这样的网址:
$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30";
即,我想用正则表达式删除st:1
。我用过:
preg_replace("/\/st:(.*)\//",'',$string)
但我得到了
end:2015-07-30
虽然我想得到:
/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30
如果我想删除fp:1
,则相同。
答案 0 :(得分:3)
您正在使用与任何角色匹配的.
贪婪匹配。
使用更受限制的模式:
preg_replace("/\/st:[^\/]*/",'',$string)
[^\/]*
否定字符类仅匹配 0个或更多字符而不是/
。
另一个解决方案是使用与*?
量词的惰性匹配,但它与否定的字符类不同。
完整注意事项:
\/st:
- 文字/st:
[^\/]*
- 除/
以外的0个或多个字符。答案 1 :(得分:3)
您可以使用:
$string = preg_replace('~/st:[^/]*~','',$string);
[^/]*
只会匹配到下一个/
答案 2 :(得分:1)
您需要在正则表达式中添加?
: -
<?php
$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30";
echo preg_replace("/\/st:(.*?)\//",'',$string)
?>
输出: - https://eval.in/397658
基于此,你也可以做下一件事。
答案 3 :(得分:0)
在这里你不应该使用正则表达式,而应该为你的特殊格式字符串制作解析实用程序函数,它们很简单,它们不需要花很长时间来编写,它们会让你的生活变得更轻松:
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编码,以免与格式冲突,这将涉及到上面类似的结构化代码。