正则表达式/str_replace:mailto 和笑脸组合的问题

regex / str_replace: issue with mailto and smiley combination

编辑:示例

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

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

但是如果用户输入 mail@example.no,可见的结果就变成了:mail@example.no,并且变成了 link。当用户单击 link 时,它会提示他们计算机上的本地电子邮件程序,并且收件人字段会自动填充为 mail@example.no


我遇到的问题

我正在开发一个用户可以在彼此的页面上发表评论的网站,我正在使用 str_replace 和正则表达式将网址替换为可点击的网址,将主题标签替换为 "clickable hashtags",笑脸代码(:P, :S, :D) 到图像等

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

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

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

如果用户输入以字母 "P" 开头的电子邮件,mailto 就会崩溃,我基本上就完蛋了。

字符串输入:

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

变为:

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

一个明显的解决方案当然是将笑脸代码 (:P) 更改为其他代码,或者干脆不创建可点击的电子邮件。但是“:P”是如此广为人知并被用户使用,所以这是一个用户体验的问题。我还有其他笑脸符号,如“:S”等,所以我希望找到一个简单实用的解决方案。

任何帮助将不胜感激!

Try this code snippet here

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

而不是这个:

$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);