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

问题描述 投票:1回答:1

我正在尝试将文本($ 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);

此代码有效,但前提是笑脸代码被空格包围。所以基本上如果有人输入“:);)”,它就不会把它当作两个单独的smilieys,但是“:);)”。

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

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

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

php regex
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.