修改:示例
当用户输入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;等等,所以我希望找到一个简单实用的解决方案。
非常感谢任何帮助!
答案 0 :(得分:1)
正则表达式 /(?<!mailto):(?:P|p)/
当前面没有:p
字时,此表达式表示匹配:P
或mailto
。
而不是:
$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);