我试图将文字($ 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到第一个捕获组。但我不认为应该这样做,而且只能部分地解决它。
答案 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 强>