需要PHP替换正则表达式,不包括一个案例

时间:2015-01-06 16:11:59

标签: php regex string-substitution

我需要替换" ::" (双冒号)带有一个正斜杠" /"在所有情况下的一组字符串中除了字符串以"]]"结尾的地方。例如:

  

SID:Common :: Location ABE :: Sub Location ABE

应该去

  

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

BUT

  

[[映射到SID :: toto tata]]

应保持原样。我尝试了各种各样的事情,其中​​一些涉及到"]"性格,但我卡住了。有人可以帮忙吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以使用此基于正面的负面前瞻符来进行匹配:

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

RegEx Demo

如果当前行以?!.*?\]\]$结尾,则

]]是否定前瞻,这意味着匹配失败。

<强>代码:

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

答案 1 :(得分:0)

您可以使用前瞻

::(?!.*]]$)

Regex Demo

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]]

答案 2 :(得分:0)

您可以使用否定前瞻

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

并替换为$1/

答案 3 :(得分:0)

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

第一个验证字符串]]中结束 (这很快):

\]\]$  

然后使用以下代码/进行全局替换:

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