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

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

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

4

3 回答 3

2

更改'/--/'and'/-/'模式的顺序,以便'/--/'首先检查,否则'/-/'将 trump '/--/'。不要在对preg_replace.

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

备择方案:

  • preg_replace按照您希望评估 RE 的顺序使用多个调用。这并不像您想象的那么令人反感,因为preg_replace循环遍历数组并依次处理每个 RE。
  • 使用评估的替代品

    $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);
    
于 2009-10-22T01:38:04.150 回答
0

这是PHP,对吧?

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

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

花括号表示“恰好需要前面的n 个模式”

这是一个很好的参考

于 2009-10-22T01:11:31.267 回答
0

看看这是否有效:

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

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

于 2009-10-22T01:19:12.423 回答