regex / str_replace:mailto和smiley组合问题

时间:2017-04-15 09:02:04

标签: php regex str-replace emoji mailto

修改:示例

当用户输入post@example.no时,可见结果变为:

ost@example.no" class="small">post@example.no

但是如果用户输入mail@example.no,则可见结果就是:mail@example.no,它就变成了一个链接。当用户单击该链接时,它会在其计算机上提示其本地电子邮件程序,并且收件人字段将自动填充mail@example.no

我遇到的问题

我正在一个用户可以对彼此的网页发表评论的网站上工作,并且我使用str_replace和regex将网址替换为可点击的网址,主题标签为"可点击的主题标签和"可点击的主题标签& #34;,将笑脸代码(:P,:S,:D)转换为图像等。

然而,当我尝试使用preg_replace将电子邮件转换为mailto时,我的"舌头" -smiley(:P)打破了它:

// MAILTO
$text = preg_replace('/(\S+@\S+\.\S+)/', '<a href="mailto:$1" class="small">$1</a>', $text);

// SMILEY
$text = str_replace(':P', '<img src="images/smileys/tongue.png" class="smiley" alt=":P" />', $text);

如果用户输入一封以字母&#34; P&#34;开头的电子邮件,邮件就会中断,我基本上就搞砸了。

字符串输入:

<a href='mailto:post@email.com'>post@email.com</a>

变为:

<a href='mailto[SMILEY]ost@email.com'>post@email.com</a>

一个明显的解决方案当然是将笑脸代码(:P)更改为其他内容,或者根本不创建可点击的电子邮件。但是&#34;:P&#34;众所周知并被用户使用,因此这是用户体验的问题。我还有其他的笑脸,如&#34;:S&#34;等等,所以我希望找到一个简单实用的解决方案。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

Try this code snippet here

正则表达式 /(?<!mailto):(?:P|p)/当前面没有:p字时,此表达式表示匹配:Pmailto

而不是:

$text = str_replace(':P', '<img src="images/smileys/tongue.png" class="smiley" alt=":P" />', $text);

使用此功能:

$text=  preg_replace('/(?<!mailto):(?:P|p)/', '<img src="images/smileys/tongue.png" class="smiley" alt=":P" />', $text);