当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《需要一个好的正则表达式将URL转换为链接,但只留下现有的链接》经验,为你挑选了3个好方法。

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

我找不到一个像样的正则表达式来捕获URL但忽略那些紧靠双引号或'>'的权利.谁有一个?



1> Tim Pietzcke..:

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> 小智..:

这个线程像山丘一样古老,但我在处理我自己的问题时遇到了它:也就是说,将任何网址转换为链接,但保留已经在锚标记内的任何网页.过了一会儿,这就是弹出的东西:

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

通过以下输入:

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

http://www.google.com

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

这是preg_replace的输出:

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

http://www.google.com

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

只是想贡献一些时间来拯救某人.


这对我有用.你是冠军!添加了'i'标志,这就是结果php:`$ text = preg_replace('@(?!(?!.*?)(?:(?: HTTPS | FTP |文件)?[?!-A-Z0-9 +&#/%=〜_ | $:,] // | | WWW\FTP \)*[A-Z0-9 + &#/%= ~_ | $] @ i','\0 ',$ text);`上面的其他解决方案不起作用我在每一个案例中.

3> 小智..:

我对原始答案中包含的正则表达式做了一些修改:

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

它允许更多子域,并且还可以对标签进行更全面的检查.要将此应用于PHP的preg替换,您可以使用:

$convertedText = preg_replace( '@(?])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '\0', $originalText );

注意,我从正则表达式中删除了@,以便将其用作preg_replace的分隔符.无论如何,@很少会在URL中使用.

显然,你可以修改替换文本,删除target ="_ blank",或者添加rel ="nofollow"等.

希望有所帮助.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有