繁体   English   中英

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

[英]Replace string between two slashes

我必须像这样修改网址:

$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: -文字/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)

 ?>

输出: -https : //eval.in/397658

基于这一点,您也可以为接下来的事情做。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM