在两个斜杠之间替换字符串

时间:2015-07-13 12:10:51

标签: php regex

我必须修改这样的网址:

$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,则相同。

4 个答案:

答案 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编码,以免与格式冲突,这将涉及到上面类似的结构化代码。