2015-07-13 73 views
1

之间替换字符串我不得不修改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

回答

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

基于这一点,你也可以做下一件事情。

+0

谢谢。如果想要匹配这个模式,当它发生在字符串的手中时?如in/sc:r2342/st:1 – giuseppe

+0

找到。 /st:(.*?)\/|\/st:(.*?)$/ – giuseppe

+1

正如我在我的回答中指出的那样,懒惰匹配 - '。*?' - 不推荐使用,因为它会影响性能,并可能会超过。也许情况并非如此,在这种情况下更多的是风格问题,但这是一个重要的说明。另外,我宁愿接受首先给出的正确答案。 –

3

您正在使用匹配任何字符的.的贪婪匹配。

使用更受限制的模式:

preg_replace("/\/st:[^\/]*/",'',$string) 

[^\/]*的否定字符类只匹配比/其它0或多个字符。

另一种解决方案是使用与*?量词的延迟匹配,但与否定字符类相比效率不高。

FULL REGEX说明

  • \/st: - 字面/st:
  • [^\/]* - 0或多个字符以外/
+1

请注意,您需要删除任何一个forwrad斜线。 –

3

您可以使用:

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

[^/]*将只匹配到明年/

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