将文本中的所有URL和电子邮件替换为PHP中的可点击链接

时间:2018-12-19 20:01:49

标签: php regex url preg-replace

在在线研究正则表达式信息时,我发现了这个很棒的php函数:

function convert($input) {
   $pattern = '@(http(s)?://)?(([a-zA-Z0-9])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
   return $output = preg_replace($pattern, '<a href="http$2://$3">$0</a>', $input);
}

我在此处由Gero Nikolov发表在 THIS POST

它可以将文本链接转换为可点击的链接,就像您在段落中显示的一样,效果很好。

但是,这是我的问题,当此代码遇到电子邮件地址时,它会省略电子邮件域之前的名称以及@,例如:name @ domain.com我猜是return该功能的一部分必须进行修改以包含电子邮件链接,但是我不确定如何将其集成到上述功能中。有条件的陈述是否必要?正则表达式对我来说还是个新手,所以我不确定这是否是正确的方向。

然后,当链接位于句子的末尾并且该句子用单引号或双引号引起来时(例如在新闻稿或文章中),它变得很奇怪。发生的情况是,链接中包括了结尾标点符号(句号,感叹号,问号等)以及结尾的引号,例如:“请确保在domain.com."上访问其网站,删除后,链接中仍包含引号:“请务必访问其位于domain.com"的网站

当常规句子的最后一个单词(不包括任何链接文本)位于单引号或双引号中时,事情变得更加奇怪。例如,带有标点符号的最后一个单词和结尾引号都被转换成这样的链接:“这是第一句。这是第二句。这是最后一个sentence."。如果结尾标点(句号等),则不会创建任何链接,并且结尾引号不受影响:“这是第一句话。这是第二句话。这是最后一句话。

因此,问题又来了,如果链接位于引号句子的末尾,该函数应如何修改以处理电子邮件地址并停止添加结尾标点和引号呢?另外,如何对其进行修改以防止将带有结尾标点的最后一个单词放在引号句子中时变成链接?

我仍然对正则表达式工作还不陌生,因此请向正确的方向提供帮助,链接和推动。此功能还有另外一件事,它可以使电话号码中的链接以点分隔(如555.555.5555变成555.555.5555),但我认为问题可以等待。再说一次,我不是要重写代码段,但是由于我不知道从哪里开始修改它,所以一定会很高兴得到一些指导。谢谢!

0 个答案:

没有答案