我有:
$txt = ':D :D ":D" :D:D:D:D';
我想preg_replace
所有:D
到^
,如果":D"
则不会替换。
===> output: '^ ^ ":D" ^^^^';
答案 0 :(得分:4)
(*跳过)(* F)魔术
$replaced = preg_replace('~"[^"]+"(*SKIP)(*F)|:D~', '^', $yourstring);
在the demo中,请参见底部窗格中的替换。
此问题是此问题中向"regex-match a pattern, excluding..."
解释的技术的典型案例交替|
的左侧匹配完成"quotes"
然后故意失败,之后引擎跳到字符串中的下一个位置。所以报价被中和了。右侧与:D
匹配,我们知道它们是正确的,因为它们与左侧的表达式不匹配。
参考
答案 1 :(得分:0)
你可以使用负向前瞻和后视,
(?<!\"):D(?!\")
它匹配的:D
前面没有"
(双引号),后跟"
。然后匹配的字符将替换为^
<?php
$string = ':D :D ":D" :D:D:D:D';
$pattern = "~(?<!\"):D(?!\")~";
$replacement = "^";
echo preg_replace($pattern, $replacement, $string);
?> //=> ^ ^ ":D" ^^^^