如果将多个表情结合在一起不能正常工作,则将文本转换为笑脸

时间:2018-03-01 16:03:29

标签: php regex

我试图将文字($ icon)转换为笑脸图片($ image)。我曾经用str_replace()来做这件事,但这似乎是顺序执行替换,因此它也替换了先前转换结果中的项目(例如在标记中)。

我现在使用以下代码:

    foreach($smiliearray as $image => $icon){

        $pattern[]="/(?<!\S)" . preg_quote($icon, '/') . "(?!\S)/u";
        $replacement[]=" <img src='$image' border='0' alt=''> ";

    }
    $text = preg_replace($pattern,$replacement,$text);

此代码有效,但前提是笑脸代码被空格包围。所以基本上如果有人输入&#34; :);&#34;,它就不会把它当成两个独立的笑脸,但是&#34; :);)&#34;确实

如何修复它以便转换一串表情符号(不用空格分隔)?

请注意,可以有无限种类的笑脸代码和笑脸图像。我事先不知道哪些,因为其他人可以提交代码和表情,所以它不仅仅是&#34;:)&#34;和&#34 ;;)&#34;,但也可以&#34; rofl&#34;,&#34;:eh&#34;,&#34;: - {&#34;,等< / p>

我可以通过在第二个捕获组的末尾添加\ W非单词来部分修复它:(?!\ S \ W),并进一步添加第二个$模式和$替换为\ W到第一个捕获组。但我不认为应该这样做,而且只能部分地解决它。

1 个答案:

答案 0 :(得分:1)

  

我过去常常使用str_replace(),但这似乎可以执行   顺序替换,因此它也替换以前的项目   转换结果......

使用strtr()的正确理由。你甚至不需要正则表达式:

<?php 

// I assume your original array looks like this
$origSmileys = [
    "/1.png" => ':)',
    "/2.png" => ':(',
    "/3.png" => ':P',
    "/4.png" => '>:('
];

// sample input string
$str = " I'm :) but :(>:(:( now :P";

// iterating over smileys to add html tag
$newSmileys = array_map(function($value) {
    return "<img src='$value' border='0' alt=''>";
}, array_flip($origSmileys));

// replace
echo strtr($str, $newSmileys);

<强> Live demo