需要一个好的正则表达式将URL转换为链接,但保留现有链接
我有大量用户提交的内容。它是 HTML,可能包含 URL。其中一些已经是的(如果用户很好),但有时用户很懒惰,只是键入 www.something.com 或充其量 http://www.something.com。<a>
我找不到一个像样的正则表达式来捕获URL,但忽略了那些紧挨着双引号或“>”右侧的正则表达式。有人有吗?
我有大量用户提交的内容。它是 HTML,可能包含 URL。其中一些已经是的(如果用户很好),但有时用户很懒惰,只是键入 www.something.com 或充其量 http://www.something.com。<a>
我找不到一个像样的正则表达式来捕获URL,但忽略了那些紧挨着双引号或“>”右侧的正则表达式。有人有吗?
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...
这个线程像山丘一样古老,但我在处理自己的问题时遇到了它:也就是说,将任何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>
只是想回馈社会,为某人节省一些时间。