防止替换HTML标记中的表情符号

时间:2013-04-11 08:54:05

标签: php regex emoticons

我使用简单的str_replace - 函数来替换我网站上的一些表情符号...

<?php

$replace = array(
    ':)' => 'smile',
    ';)' => 'wink',
    …
);

$string = 'Lorem ipsum (&quot;dolor&quot;) sit amet! :)';

foreach($replace as $search => $replace) {
    $string = str_replace($search, '<img src="/img/'.$replace.'.png" alt="'.$search.'">', $string);
}

?>

关于这个简单替换的问题是,来自&quot; - 标签的“;)”将被替换,并且HTML代码将被破坏。有没有办法/解决方法(一个特殊的正则表达式)来解决这个“问题”?谢谢! :)

4 个答案:

答案 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 (&quot;dolor&quot;) sit amet! <img src="/img/smile.png" alt=":)">

答案 2 :(得分:0)

使用:

$string = html_entity_decode($string);

在替换之前(foreach),这样&quot;将被读作实际引号,而不是被替换。如果您在数据库或其他东西上存储,之后可以使用htmlentities()再次获得&quot;'s

答案 3 :(得分:0)

这是我的第二个答案,你是对的,最后我们需要使用正则表达式。 基本上,$negation正则表达式是转发搜索的前缀,我想它可以进行优化,但现在它对我有效。

$smileys = array(
    ':)' => 'smile',
    ';)' => 'wink'
);

$string = 'Lorem ipsum (&quot;dolor&quot;) 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);