【发布时间】:2014-09-01 12:53:28
【问题描述】:
我有:
$txt = ':D :D ":D" :D:D:D:D';
我想将preg_replace 全部:D 改为^,如果":D" 则不替换。
===> output: '^ ^ ":D" ^^^^';
【问题讨论】:
我有:
$txt = ':D :D ":D" :D:D:D:D';
我想将preg_replace 全部:D 改为^,如果":D" 则不替换。
===> output: '^ ^ ":D" ^^^^';
【问题讨论】:
(*SKIP)(*F) 魔法
$replaced = preg_replace('~"[^"]+"(*SKIP)(*F)|:D~', '^', $yourstring);
在the demo 中,查看底部窗格中的替换。
这个问题是这个问题中向"regex-match a pattern, excluding..."解释的技术的经典案例
交替| 的左侧匹配完整的"quotes" 然后故意失败,之后引擎跳到字符串中的下一个位置。所以报价被中和了。右侧匹配:D,我们知道它们是正确的,因为它们没有被左侧的表达式匹配。
参考
【讨论】:
您可以使用否定的前瞻和后瞻,
(?<!\"):D(?!\")
它匹配:D,它前面没有"(双引号),后面跟着"。然后匹配的字符被替换为^
<?php
$string = ':D :D ":D" :D:D:D:D';
$pattern = "~(?<!\"):D(?!\")~";
$replacement = "^";
echo preg_replace($pattern, $replacement, $string);
?> //=> ^ ^ ":D" ^^^^
【讨论】: