Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 替换两个斜杠之间的字符串_Php_Regex - Fatal编程技术网

Php 替换两个斜杠之间的字符串

Php 替换两个斜杠之间的字符串,php,regex,Php,Regex,我必须修改如下URL: $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 如果我想删除

我必须修改如下URL:

$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

您正在使用贪心匹配与任何字符匹配的
,则相同

使用更严格的模式:

preg_replace("/\/st:[^\/]*/",'',$string)
[^\/]*
求反字符类仅匹配0个或更多字符,而不是
/

另一种解决方案是将惰性匹配与
*?
量词一起使用,但它并不像否定字符类那样有效

完整正则表达式解释

  • \/st:
    -literal
    /st:
  • [^\/]*
    -0个或更多字符,而不是
    /
您可以使用:

$string = preg_replace('~/st:[^/]*~','',$string);

[^/]*
将只匹配到下一个
/
您需要在正则表达式中添加
:-

<?php

$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30";
echo preg_replace("/\/st:(.*?)\//",'',$string)

 ?>

输出:-


基于这一点,您还可以做下一件事。

在这里,您不需要使用正则表达式,而应该为您的特殊格式字符串创建解析实用程序函数,它们很简单,编写时间不长,而且它们将使您的生活更加轻松:

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

注意,您需要删除任意一个forwrad斜杠。谢谢。如果它发生在绳子的手上,你是否也想匹配这种模式?如/sc:r2342/st:1所示/st:(.*?\/| \/st:(.*?$)/正如我在回答中指出的,不建议使用惰性匹配-
*?
,因为它会影响性能,并且可能会过度匹配。也许情况并非如此,在这种情况下,更多的是风格问题,但这是一个重要的注意事项。另外,我宁愿接受第一个给出的正确答案。