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

时间:2011-04-18 10:36:04

标签: php regex perl

我已经检查了谷歌在这个问题上的帮助,但所有答案都忽略了替换方法中的致命缺陷。

基本上我有一组表情符号,例如:) LocK:eek等等,需要用图像标签替换它们。我遇到的问题是确定一个特定的表情符号不是一个单词的一部分而且单独就行了。例如,在我们的网站上,我们允许“快速链接”不包含在笑脸替换中,格式为go:forum,user:Username等。几乎我读过的所有答案都不允许这种可能性,因此打破这些链接(即go< img src =“image.gif”/> orum)。我试过用不同的方法来解决这个问题,以检查线的起点,空格/换行符等等,但我没有太多运气。

对此问题的任何帮助将不胜感激。哦,我也使用PHP 5和preg_%函数。

谢谢, 鲁珀特S。

编辑18/04/2011:

感谢您的帮助窥视:)已经创建了最终的正则表达式,虽然我与大家分享,有一些问题与特殊的空间字符包括换行,但它现在像梦一样工作最终的正则表达式是:< / p>

(?&lt; = \ s | \ A | \ n | \ r | \ t | \ v | \&lt; br \ / \&gt; | \&lt; br \&gt;)(:S)(? = \ s | \ Z | $ | \ n | \ r | \ t | \ v | \&lt; br \ / \&gt; | \&lt; br \&gt;)

2 个答案:

答案 0 :(得分:4)

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

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

\s涵盖普通空格和换行符。只是为了安全^$覆盖文本主题开头或结尾的事件。断言本身不匹配,因此可以在替换字符串/回调中忽略。

答案 1 :(得分:3)

如果你想在一个preg_replace中做所有替换,试试这个:

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