Php regex/stru替换:mailto和smiley组合的问题

Php regex/stru替换:mailto和smiley组合的问题,php,regex,str-replace,emoji,mailto,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

编辑:示例

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

ost@example.no" class="small">post@example.no
但是如果用户进入mail@example.no,可见的结果就是:mail@example.no,它成为一个链接。当用户单击链接时,它会提示他们计算机上的本地电子邮件程序,收件人字段将自动填充为mail@example.no


我遇到的问题

我在一个网站上工作,用户可以在彼此的页面上发表评论,我使用str_replace和regex将URL替换为可点击的URL,将hashtags替换为“可点击的hashtags”,将笑脸代码(:p,:s,:D)替换为图像等

然而,当我试图用preg_replace将电子邮件转换为mailto时,我的“舌头”——笑脸(: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);
//MAILTO
$text=preg\u replace('/(\S+@\S+\.\S+/','',$text);
//笑脸
$text=str_replace(':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>
$text=  preg_replace('/(?<!mailto):(?:P|p)/', '<img src="images/smileys/tongue.png" class="smiley" alt=":P" />', $text);

变成:

<a href='mailto:post@email.com'>post@email.com</a>
<a href='mailto[SMILEY]ost@email.com'>post@email.com</a>
$text=  preg_replace('/(?<!mailto):(?:P|p)/', '<img src="images/smileys/tongue.png" class="smiley" alt=":P" />', $text);

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

任何帮助都将不胜感激

正则表达式:
/(?当前面没有
mailto
单词时,此表达式表示match
:p
:p

而不是这个:

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

<a href='mailto:post@email.com'>post@email.com</a>
<a href='mailto[SMILEY]ost@email.com'>post@email.com</a>
$text=  preg_replace('/(?<!mailto):(?:P|p)/', '<img src="images/smileys/tongue.png" class="smiley" alt=":P" />', $text);

$text=preg\u replace('/(?请用示例、输入和预期输出更新您的帖子。谢谢,我现在添加了一个示例,让我们假设您有这个
:p
,并且您希望将href属性中的
:p
结尾替换为
:p
。这是正确的吗?是的,这正是将糟糕的情况变成更糟的情况。基本上电子邮件地址应该是纯文本,而不是HTML。kimnthorstensen需要做的就是不要将他的笑脸代码应用于电子邮件地址的HTML。@KIKOSoftware我接受了OP提到的具体案例,我认为没有必要投反对票。请查看OP的评论。它会描述你那个人是什么是的,有。用其他坏代码修复坏代码是没有帮助的。这对
mailto:p
有效,但是当smiley出现下一个问题时怎么办?也修复它?不!问题不完整,所以我可以制定一个好的答案。更好的答案可能是:在电子邮件代码之前做smiley。S意味着交换它们,问题就不会再发生了。@kimnthorstensen欢迎…:)