替换:D表情符号,“:D”内部除外


Replace :D emoticons, except inside ":D"

我有:

$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" ^^^^

演示