PHP文本到表情符号

时间:2016-11-30 20:58:09

标签: php regex preg-replace

我有点挣扎......

我查了5个关于此问题的stackoverflow问题,但它们似乎都没有像我想象的那样工作。基本上我只想替换"单词"用表情符号。

问题在于,当单词不是另一个单词的一部分时,我希望单词仅转换为

这是我到目前为止的代码:

$text = ":D i dont kn:ow about this :O i just want to :) and :D everyday:P";
$icons = array(
        ':)' => '<img class="postemot" src="/emoticons/smile_yell.png" />',
        ':D' => '<img class="postemot" src="/emoticons/laugh_yell.png" />',
        ':(' => '<img class="postemot" src="/emoticons/sad_yell.png" />',
        '>:O' => '<img class="postemot" src="/emoticons/scared_yell.png" />',
        ':p' => '<img class="postemot" src="/emoticons/tongue_yell.png" />',
        ':P' => '<img class="postemot" src="/emoticons/tongue_yell.png" />',
        ':O' => '<img class="postemot" src="/emoticons/surprised_yell.png" />',
        ':o' => '<img class="postemot" src="/emoticons/surprised_yell.png" />'
    );
    foreach($icons as $icon=>$image) {
          $icon = preg_quote($icon);
          $text = preg_replace("~\b$icon\b~",$image,$text);
    }
    echo $text;

但它没有奏效。输出不正确。实际上唯一输出的表情符号是最后一个,&#34;每天:P&#34; ,这是不正确的。

1 个答案:

答案 0 :(得分:4)

在表情符号周围应用单词边界元字符是不对的,因为\b匹配了不需要的位置:

everyday:P
        ^ asserts right before here

所以你必须使用lookarounds来处理另一个断言,以确保表情符号不被非空格字符包围:

(?<!\S)$icon(?!\S)