笑脸替换HTML-String的CDATA

时间:2010-05-24 09:12:07

标签: php replace

我有一个简单的问题:(我需要用相应的笑脸图片替换文本表情符号。好吧..那不是很复杂,但现在我只需要替换HTML标签以外的笑脸外观。简短的例子:< / p>

文字:

Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.

我想用这个笑脸的图像替换“:/”......

好的,如何以最好的方式做到这一点?

6 个答案:

答案 0 :(得分:2)

我不会尝试创建一些超级剧本,但要考虑它......表情符号总是被空格包围。所以str用笑脸取代':/'。你可能会说“句子末尾的笑脸怎么样(哪里会用得最多)”。那么只需在潜在笑脸的左侧或右侧检查至少一个空格。

使用上述脚本:

$smiley_array = array(
    ":) " => "<a href...>",
    " :)" => "<a href...>",
    ":/ " => "<a href...>",
    " :/" => "<a href...>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

如果你不想输入两次,你可以从一个笑脸阵列生成数组。

答案 1 :(得分:1)

为什么不尝试在你的笑脸文本周围使用一些特殊的字符,这可能是:/ / - 这将使您的笑脸文字变得独特且易于识别

答案 2 :(得分:1)

将preg_replace与lookbehind断言一起使用。例如:

$smileys = array(
  ':/' => '<img src="..." alt=":/">'
);
foreach ($smileys as $smile => $img) {
  $text = preg_replace('@(?<!<[^<>]*)' . preg_quote($smile, '@') . '@',
                       $img, $text);
}

正则表达式应仅匹配不在尖括号内的表情符号。如果你有很多误报,这可能会很慢。

答案 3 :(得分:0)

我不知道最好的方式,只有我这样做的方式。

构建一个数组,其中以笑脸代码为键,链接为值。使用str_replace。将“针”作为键的数组(笑脸代码)和“替换”值的数组。

例如,假设你有类似的东西:

$smiley_array = array(":)" => "<a href...>",
    ":(" => "<a href=....>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

编辑:如果这可能会意外地用笑脸链接替换其他实例,您应该考虑使用preg_replace的正则表达式。显然preg_replace 比str_replace慢

答案 4 :(得分:0)

你可以使用正则表达式,或上面的额外草率版本:

$smiley_array = array(":)" => "<a href...>",
    ":(" => "<a href=....>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace("://", "%%QF%%", $str);
$str = str_replace($codes, $links, $str);
$str = str_replace("%%QF%%", "://", $str);

实际上,假设str_replace遵循数组排序...... 这应该有效:

$smiley_array = array("://" => "%%QF%%", ":)" => "<a href...>",
    ":(" => "<a href=....>", "%%QF%%" => "://");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

答案 5 :(得分:0)

可能过度杀伤(增加cpu /负载),但99.99999999%安全:

<?php
$n = new DOMDocument();
$n->loadHTML('<p>Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.</p>');
$x = new DOMXPath($n);
$instances = $x->query('//text()[contains(.,\':/\')]');//or use '//*[child::text()]' for all textnodes
foreach($instances as $node){
    if($node instanceof DOMText && preg_match_all('/:\//',$node->wholeText,$matches,PREG_OFFSET_CAPTURE|PREG_SET_ORDER)){
            foreach($matches[0] as $match){
                    $newnode = $node->splitText($match[1]);
                    $newnode->replaceData(0,strlen($match[0]),'');
                    $img = $n->createElement('img');
                    $img->setAttribute('src','smily.gif');
                    $img = $newnode->parentNode->insertBefore($img,$newnode);
                    //var_dump($match);
            }
    }
}
var_dump($n->saveHTML());
?>

但实际上你不想经常这样做,保存一次,显示很多,如果你让用户编辑html(beys in wysiwyg或者其他方面,'return'转换(img to text)是一个你可以扩展不同的表情符号(一个怪物正则表达式匹配它们,或几个较小的/ strstr()的可读性,以及一个笑脸到src的数组(例如数组(':/'=&gt ;'frown.gif'))将是要走的路。

相关问题