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

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

我知道这是因为我没有适当的regex模式,但是什么图案是什么?

有帮助吗?

解决方案

改变了的 '/--/''/-/' 模式,以便 '/--/' 首先检查,否则 '/-/' 将特朗普 '/--/'.不要插入这些阵列在呼叫 preg_replace.

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

备选方案:

  • 使用多个电话来 preg_replace 在命令你希望评估的REs。这是不是令人讨厌的你可能会认为是因为 preg_replace 循环多数组处理的每一个重。
  • 使用评估的更换

    $url = "www-example-com--folder";
    $replacements = array('-' => '.', '--' => '/');
    $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
    
  • 使用 预期,并回顾

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

其他提示

这是PHP,对吧?

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

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

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

这是良好的参考资料

看看是否有效:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top