我有:
$txt = ':D :D ":D" :D:D:D:D';
我想preg_replace
所有:D
^
,如果":D"
则不替换。
===> output: '^ ^ ":D" ^^^^';
(*SKIP((*F( 魔法
$replaced = preg_replace('~"[^"]+"(*SKIP)(*F)|:D~', '^', $yourstring);
在演示中,请参阅底部窗格中的替换项。
这个问题是这个问题中解释的技术的一个经典案例,即"正则表达式匹配模式,排除..."
交替|
匹配的左侧完全"quotes"
然后故意失效,之后发动机跳到弦中的下一个位置。所以引号被中和了。右侧匹配:D
,我们知道它们是正确的,因为它们与左侧的表达式不匹配。
参考
- 如何匹配(或替换(模式,除非在 s1、s2、s3 的情况下...
- 关于匹配模式的文章,除非...
你可以使用负的前瞻性和后视,
(?<!'"):D(?!'")
它匹配前面没有"
(双引号(后跟"
:D
。然后匹配的字符替换为^
<?php
$string = ':D :D ":D" :D:D:D:D';
$pattern = "~(?<!'"):D(?!'")~";
$replacement = "^";
echo preg_replace($pattern, $replacement, $string);
?> //=> ^ ^ ":D" ^^^^
演示