$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
我想要的输出是example.com/folder
,但我现在得到的只是example.com..folder
我知道这是因为我没有正确的正则表达式模式,但该模式是什么?
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
我想要的输出是example.com/folder
,但我现在得到的只是example.com..folder
我知道这是因为我没有正确的正则表达式模式,但该模式是什么?
更改'/--/'
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);
这是PHP,对吧?
您需要一个量词来指定您想要在第二个模式中恰好有两个连字符。尝试:
$searchArray = array('/-/','/-{2}/');
花括号表示“恰好需要前面的n 个模式”
这是一个很好的参考。
看看这是否有效:
$url = "example-com--文件夹"; $searchArray = array('([^-])-([^-])','--'); $replaceArray = array('$1.$2','/'); $url = preg_replace("$searchArray", "$replaceArray", $url);
这说的是“匹配任何 - 之前或之后没有破折号并将其替换为 .” 和“匹配双 - 与 /”。显然,您可以仅通过在 from 和 back 添加 ([^-]) 来扩展它以将第二个匹配限制为 2 个破折号。实际上,“-----”将变成“//”,这可能是您不想要的。