我有大量用户提交的内容.它是HTML,可能包含URL.其中一些已经是(如果用户是好的)但有时用户是懒惰的,只需输入www.something.com或最好是http://www.something.com.
我找不到一个像样的正则表达式来捕获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这样的地址......
这个线程像山丘一样古老,但我在处理我自己的问题时遇到了它:也就是说,将任何网址转换为链接,但保留已经在锚标记内的任何网页.过了一会儿,这就是弹出的东西:
(?!(?!.*?)(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+/%=~_|$?!:,.]*[A-Z0-9+/%=~_|$]
通过以下输入:
http://www.google.com http://google.com www.google.comhttp://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.comthis is a normal sentence. let's hope it's ok. www.google.com
只是想贡献一些时间来拯救某人.
我对原始答案中包含的正则表达式做了一些修改:
(?])\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"等.
希望有所帮助.