替换:D表情符号,除了内部":D"

时间:2014-07-11 00:49:35

标签: php regex pcre emoticons

我有:

$txt = ':D :D ":D" :D:D:D:D';

我想preg_replace所有:D^,如果":D"则不会替换。

===> output: '^ ^ ":D" ^^^^';

2 个答案:

答案 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" ^^^^

DEMO