2

我使用一个简单的str_replace-function 来替换我网站上的一些表情符号……</p>

<?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;-tag 中的“;)”也会被替换,HTML 代码也会被破坏。有没有办法/解决方法(一个特殊的正则表达式,即)来解决这个“问题”?谢谢!:)

4

4 回答 4

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);
于 2013-04-11T10:17:33.700 回答
0

最简单的方法是这样做:

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

基本上只有在表情符号前面有空格时才替换它们。如果用户写:

Hello my name is John:)- 这是他们的错误,不是你的。


第二种选择是在替换表情之前使用htmlspecialchars_decode() 。

于 2013-04-11T08:57:37.133 回答
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=":)">
于 2013-04-11T08:58:58.853 回答
0

利用:

$string = html_entity_decode($string);

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

于 2013-04-11T09:01:09.817 回答