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

Php 如果多个笑脸组合在一起不起作用,则将文本转换为笑脸,php,regex,Php,Regex,我正在尝试将文本($icon)转换为笑脸图像($image)。我以前用str_replace()来做这件事,但这似乎是按顺序执行的,因此它也会替换以前转换的结果中的项(例如标记中的项) 我现在使用以下代码: foreach($smiliearray as $image => $icon){ $pattern[]="/(?<!\S)" . preg_quote($icon, '/') . "(?!\S)/u"; $replacement[]="

我正在尝试将文本($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);
foreach($smiliearray作为$image=>$icon){
$pattern[]=“/(?)?
我曾经用
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);

“我事先不知道是哪一个"。那么你就不走运了。如果你没有预定义的列表,你怎么知道什么东西被替换了,什么东西没有被替换呢?如果没有特定的规则集,我看不出这怎么行。例如,
rofl
lmao
等常见术语可以直接替换。但是,在与客户打交道时m代码,我推荐类似的东西-必须以
或任何其他特定字符开头。然后,您将能够使用该起始特殊字符作为分隔符。因为没有可靠的分隔符,并且您说“无限种类的笑脸代码和笑脸图像”我怀疑任何catchall解决方案,因为它与str_replace一起工作,str_replace可以搜索并替换一个“单词”中的多个项目,因此它可以将“;):)”替换为两个单独的笑脸。唯一的问题是它是顺序的,因此也可以用str_replace(),但这似乎是按顺序执行替换…这是使用
strtr()
的真正原因,感谢revo的建议。在看到您的最新回复之前,我已经尝试过strtr(),后来发现了这一点(非笑脸)将文本替换为html会干扰它,因为它有时会替换html代码的一部分。例如,如果有人用代码“class=”笑脸。我修复了通过strtr()将项目替换为base64_编码的html,并用伪html标记封装。执行完所有操作后,我运行preg_replace_回调()将其转换回html。这是一种解决方法,但目前为止似乎有效。如果您显示此类输入以提供更合适的答案,这将非常有帮助。不,我的意思是我签出了strtr(),注意到了这些问题,并在您第一次建议使用strtr()后对其进行了修复,在我看到您的代码示例之前。那么这个具体的答案及其方法在您的案例中是否有效?我只是想知道我是否可以改进或添加另一个解决方案。它有效,并且似乎是一种更复杂的方法,而不是我如何做。我目前使用最初发布的代码,但将“$replacement[]”更改为“$replacement[$icon]”然后执行“strtr($text,$replacement);”而不是preg_replacement…其中$replacement是base64_编码的字符串。