需要一个好的正则表达式将URL转换为链接,但保留现有链接

2022-08-30 19:51:33

我有大量用户提交的内容。它是 HTML,可能包含 URL。其中一些已经是的(如果用户很好),但有时用户很懒惰,只是键入 www.something.com 或充其量 http://www.something.com<a>

我找不到一个像样的正则表达式来捕获URL,但忽略了那些紧挨着双引号或“>”右侧的正则表达式。有人有吗?


答案 1

RegexBuddy的创建者Jan Goyvaerts写了一篇对Jeff Atwood博客的回应,解决了Jeff遇到的问题,并提供了一个很好的解决方案。

\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]

为了忽略在“ 或>旁边发生的匹配,您可以添加到正则表达式的开头,这样您就可以获得(?<![">])

(?<![">])\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]

这将匹配完整地址(http://...)和以 www 开头的地址。或 ftp。- 你运气不好,地址像 ars.userfriendly.org...


答案 2

这个线程像山丘一样古老,但我在处理自己的问题时遇到了它:也就是说,将任何URL转换为链接,但不要理会任何已经在锚标记中的链接。过了一会儿,这就是突然出现的内容:

(?!(?!.*?<a)[^<]*<\/a>)(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]

使用以下输入:

http://www.google.com
http://google.com
www.google.com

<p>http://www.google.com<p>

this is a normal sentence. let's hope it's ok.

<a href="http://www.google.com">www.google.com</a>

这是preg_replace的输出:

<a href="http://www.google.com" rel="nofollow">http://www.google.com</a>
<a href="http://google.com" rel="nofollow">http://google.com</a>
<a href="www.google.com" rel="nofollow">www.google.com</a>

<p><a href="http://www.google.com" rel="nofollow">http://www.google.com</a><p>

this is a normal sentence. let's hope it's ok.

<a href="http://www.google.com">www.google.com</a>

只是想回馈社会,为某人节省一些时间。


推荐