复杂的PHP/Perl正则表达式的表情符号


Complex PHP/Perl regular expression for emoticons

我已经在谷歌上搜索了关于这个主题的帮助,但是所有的答案都忽略了替换方法中的一个致命缺陷。

基本上我有一组表情符号,如:)锁:周等,需要用图像标签替换它们。我遇到的问题是确定一个特定的表情符号不是一个单词的一部分,而是单独在一条线上。例如,在我们的网站上,我们允许"快速链接",这是不包括在笑脸替代采取格式go:论坛,用户:用户名等。我读过的几乎所有答案都不允许这种可能性,因此打破了这些链接(即goorum)。我试过用不同的方法来检查行开始,空格/换行符等,但我没有太多的运气。

对于这个问题,任何帮助都将是非常感激的。哦,我也使用PHP 5和preg_%函数。

谢谢,鲁珀特·s .

编辑18/04/2011:

谢谢你的帮助,peeps:)已经创建了最终的正则表达式,我想我会与大家分享,有几个问题与特殊的空格字符,包括换行符,但它现在像一个梦一样工作,最终的正则表达式是:

(& lt; = ' s r | | ' n | | ' ' ' t v | | ' ' & lt; br '/'祝辞| ' & lt; br '祝辞)(s) (? = ' s | ' Z | $ | ' n v | | ' r t | | ' ' ' & lt; br '/'祝辞| ' & lt; br '祝辞)

将注释完成为答案:最简单的解决方法是断言表情符号总是被空格包围。

 (?<='s|^)[<:-}]+(?='s|$)

's包含正常空格和换行符。只是为了安全,^$覆盖在文本主题的开始或非常结束处发生的事件。断言本身不匹配,因此可以在替换字符串/回调中忽略。

如果您想在一个preg_replace中完成所有的替换,请尝试以下操作:

preg_replace('/(?<=^|'s)(:')|:eek)(?=$|'s)/e'
    ,"'$1'==':)'?'<img src='"smile.gif'"/>':('$1'==':eek'?'<img src='"eek.gif'"/>':'$1')"
    ,$input);