我有一个简单的问题:(我需要用相应的笑脸图片替换文本表情符号。好吧..那不是很复杂,但现在我只需要替换HTML标签以外的笑脸外观。简短的例子:< / p>
文字:
Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.
我想用这个笑脸的图像替换“:/”......
好的,如何以最好的方式做到这一点?
答案 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'))将是要走的路。