【问题标题】:Replace :D emoticons, except inside ":D"替换 :D 表情符号,“:D”内除外
【发布时间】:2014-09-01 12:53:28
【问题描述】:

我有:

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

我想将preg_replace 全部:D 改为^,如果":D" 则不替换。

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

【问题讨论】:

    标签: php regex pcre emoticons


    【解决方案1】:

    (*SKIP)(*F) 魔法

    $replaced = preg_replace('~"[^"]+"(*SKIP)(*F)|:D~', '^', $yourstring);
    

    the demo 中,查看底部窗格中的替换。

    这个问题是这个问题中向"regex-match a pattern, excluding..."解释的技术的经典案例

    交替| 的左侧匹配完整的"quotes" 然后故意失败,之后引擎跳到字符串中的下一个位置。所以报价被中和了。右侧匹配:D,我们知道它们是正确的,因为它们没有被左侧的表达式匹配。

    参考

    【讨论】:

      【解决方案2】:

      您可以使用否定的前瞻和后瞻

      (?<!\"):D(?!\")
      

      它匹配:D,它前面没有"(双引号),后面跟着"。然后匹配的字符被替换为^

      <?php
      $string = ':D :D ":D" :D:D:D:D';
      $pattern = "~(?<!\"):D(?!\")~";
      $replacement = "^";
      echo preg_replace($pattern, $replacement, $string);
      ?> //=> ^ ^ ":D" ^^^^
      

      DEMO

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        • 2020-10-10
        • 1970-01-01
        • 2022-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多