我使用简单的str_replace
- 函数来替换我网站上的一些表情符号...
<?php
$replace = array(
':)' => 'smile',
';)' => 'wink',
…
);
$string = 'Lorem ipsum ("dolor") sit amet! :)';
foreach($replace as $search => $replace) {
$string = str_replace($search, '<img src="/img/'.$replace.'.png" alt="'.$search.'">', $string);
}
?>
关于这个简单替换的问题是,来自"
- 标签的“;)”将被替换,并且HTML代码将被破坏。有没有办法/解决方法(一个特殊的正则表达式)来解决这个“问题”?谢谢! :)
答案 0 :(得分:0)
最简单的方法是:
$replace = array(
' :)' => ' smile',
' ;)' => ' wink',
);
基本上只有替换表情符号(如果它们前面有空格)。如果用户写道:
Hello my name is John:)
- 这是他们的错,不是你的。
第二种选择是在替换表情符之前使用htmlspecialchars_decode()。
答案 1 :(得分:0)
将preg_replace
与\B
(非字边界)
$string = preg_replace("/\B".preg_quote($search)."\B/", '<img src="/img/'.$replace.'.png" alt="'.$search.'">', $string);
测试
[root@srv ~]# php test.php
Lorem ipsum ("dolor") sit amet! <img src="/img/smile.png" alt=":)">
答案 2 :(得分:0)
使用:
$string = html_entity_decode($string);
在替换之前(foreach),这样"
将被读作实际引号,而不是被替换。如果您在数据库或其他东西上存储,之后可以使用htmlentities()再次获得"'s
。
答案 3 :(得分:0)
这是我的第二个答案,你是对的,最后我们需要使用正则表达式。
基本上,$negation
正则表达式是转发搜索的前缀,我想它可以进行优化,但现在它对我有效。
$smileys = array(
':)' => 'smile',
';)' => 'wink'
);
$string = 'Lorem ipsum ("dolor") sit amet! :)';
$negation = '[^&\w*]'; // Here is the magic, this is the part that avoids the search to be preceded by &+characters
foreach($smileys as $icon => $name) {
$replace[] = '<img src="/img/'.$name.'.png" alt="'.$icon.'">'; //we create an array with the corresponding replaces
$search[] = '/'.$negation.preg_quote($icon).'/'; //Magic second part, preg_quote escapes the smileys to sarch for PCRE, we prepend the magical regex.
}
$string = preg_replace($search, $replace, $string);