正则表达式匹配多个模式

时间:2009-10-22 00:59:38

标签: regex preg-replace

$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);

我想要的输出是example.com/folder,但我现在得到的只是example.com..folder

我知道这是因为我没有正确的正则表达式模式,但那种模式会是什么?

3 个答案:

答案 0 :(得分:2)

更改'/--/''/-/'模式的顺序,以便先检查'/--/',否则'/-/'将胜过'/--/'。不要在对preg_replace的调用中插入数组。

$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);

备选方案:

  • 按照您希望评估RE的顺序多次调用preg_replace。这并不像你想象的那样令人讨厌,因为preg_replace循环遍历数组并依次处理每个RE。
  • 使用已评估的替换

    $url = "www-example-com--folder";
    $replacements = array('-' => '.', '--' => '/');
    $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
    
  • 使用lookahead and lookbehind

    $url = "www-example-com--folder";
    $searchArray = array('/(?<!-)-(?!-)/', '/--/');
    $replaceArray = array('.', '/');
    $url = preg_replace($searchArray, $replaceArray, $url);
    

答案 1 :(得分:0)

这是PHP,对吧?

您需要一个量词来指定您在第二个模式中只需要两个连字符。尝试:

$searchArray = array('/-/','/-{2}/');

大括号说'要求 n 前面的模式'

这是good reference

答案 2 :(得分:0)

看看是否有效:

$url = "example-com--folder";
$searchArray = array('([^-])-([^-])','--');
$replaceArray = array('$1.$2','/');
$url = preg_replace("$searchArray", "$replaceArray", $url);

这说的是“匹配任何 - 在之前或之后没有破折号并用a替换它”。和“匹配双 - 与/”。很明显,你可以通过在from和back添加([^ - ])来扩展它以将第二个匹配限制为2个破折号。事实上,“-----”将变成“//”,你可能不想要它。