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

3
我已经在Google上查找了有关此主题的帮助,但所有答案都忽略了替换方法中的致命缺陷。
本质上,我有一组表情符号,例如:) LocK :eek等,需要用图像标签替换它们。我遇到的问题是识别特定表情符号不是单词的一部分,而是独立存在于一行上。例如,在我们的网站上,我们允许“快速链接”,这些链接不包括在表情符号替换中,格式为go:forum,user:Username等等。我读过的几乎所有答案都不允许这种可能性,因此会破坏这些链接(即go<img src="image.gif" />orum)。我尝试了各种不同的方法来解决这个问题,例如检查行的开头、空格/换行符等等,但没有太多运气。
非常感谢您对此问题的帮助。哦,还有,我正在使用PHP 5和preg_%函数。
谢谢, 鲁珀特S。
编辑18/04/2011:
感谢大家的帮助:)已创建最终正则表达式,我认为我应该与大家分享,出现了一些问题,涉及特殊空格字符,包括换行符,但现在它的工作就像梦想一样,最终的正则表达式是:
(?<=\s|\A|\n|\r|\t|\v|\<br \/\>|\<br\>)(:S)(?=\s|\Z|$|\n|\r|\t|\v|\<br \/\>|\<br\>)

在你的模式周围使用单词边界? - Nick
我尝试过使用它,但我不确定是否使用正确,因为你会得到单词边界和非单词边界,而我不明白这是什么意思?空格和其他东西不是单词吗? - Maj. Fail
1
断言表情符号被空格包围 (?<=\s)[<:-}]+(?=\s) - 这应该涵盖了您想要的内容,并且比单词/非单词边界更具体。 - mario
那是否包括像行首/行尾/换行符等字符/实体?例如,如果笑脸在一行的末尾,它的一侧就不会被空格包围了吗? - Maj. Fail
1
\s 表示任何空格,包括换行符。如果主题的结尾没有换行符,则会失败。对于这种情况,请使用 (?=\s|$) - mario
谢谢,谢谢,谢谢,这解决了我的问题 :) - Maj. Fail
2个回答

4
为了将评论转换为答案:最简单的解决方法是断言表情符号始终被空格包围。
 (?<=\s|^)[<:-}]+(?=\s|$)

\s 包括普通空格和换行符。为了保险起见,^$ 可以用于匹配文本主题的开头或结尾。这些断言本身不匹配,因此可以在替换字符串/回调中忽略。


3
如果你想在一次 preg_replace 中完成所有替换,请尝试以下方法:
preg_replace('/(?<=^|\s)(:\)|:eek)(?=$|\s)/e'
    ,"'$1'==':)'?'<img src=\"smile.gif\"/>':('$1'==':eek'?'<img src=\"eek.gif\"/>':'$1')"
    ,$input);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接