需要排除一种情况的 PHP 替换正则表达式


Need PHP substitution regex that excludes one case

我需要在所有情况下将"::"(双冒号)替换为一组字符串中的单个正斜杠"/",除非字符串以"]]"结尾。例:

SID:通用::位置 ABE:

:子位置 ABE

应该去

SID:公共/位置 ABE/子位置 ABE

[

[地图到SID::toto tata]]

应保持原样。我尝试了各种方法,其中一些涉及对"]"字符的负面展望,但我被卡住了。谁能帮忙?

谢谢!

您可以使用这个基于前瞻的负正则表达式进行匹配:

::(?!.*?']']$)

正则表达式演示

?!.*?']']$ 是一个负面的展望,这意味着如果当前行以 ]] 结尾,则匹配失败。

法典:

$re = '/::(?!.*?'']'']$)/';  
$result = preg_replace($re, '/', $input);

您可以使用展望

::(?!.*]]$)

正则表达式演示

preg_replace("/::(?!.*]]$)/", "/", "SID:Common::Location ABE::Sub Location ABE");
=> SID:Common/Location ABE/Sub Location ABE
preg_replace("/::(?!.*]]$)/", "/", "[[Maps to SID::toto tata]]");
=> [[Maps to SID::toto tata]]

您可以使用负前瞻

/^(?!'['[)([^:]+)::/

并替换为$1/

如果您尝试在 1 个正则表达式中执行此操作,则存在 N 阶乘类型的延迟。
最简单的方法是使用 2 个正则表达式。

第一个验证字符串是否以 ]]
结尾(这非常快):

']']$  

然后只需使用以下命令对/进行全局替换:

(?<!:)::(?!:)