从字符串中提取URL

Jac*_*vin 12 php regex url preg-replace

我正在尝试找到一个可靠的解决方案,从一串字符中提取url.我有一个用户回答问题的网站,在源框中,他们输入了他们的信息来源,我允许他们输入网址.我想提取该URL并使其成为超链接.与Yahoo Answers的工作方式类似.

有谁知道可以做到这一点的可靠解决方案?

我找到的所有解决方案都适用于某些URL,但不适用于其他URL.

谢谢

小智 22

John Gruber 花了相当多的时间来完善链接检测的"一个正则规则来统治所有人".使用preg_replace()其他答案中提到的,使用以下正则表达式应该是检测链接的最准确(如果不是最准确)方法之一:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
Run Code Online (Sandbox Code Playgroud)

如果您只想匹配HTTP/HTTPS:

(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想要转换为非捕获的子模式以及转义斜杠转义的人:\ b(?:(?:[az] [\ w - ] + :(?:\/{1,3} | [A-Z0-9%])| WWW\d {0,3} [.] | - [.] [A-Z0-9 \] + [AZ] {2,4}\/)(?: [^\S()<>] + | \((?:[^\S()<>] + |(?:\([^\S()<>] + \)))*\)) ?+(:\((:[^\S()<>] + |(?:!\([^\S()<>] + \)))*\)| [^\s`( )\ [\] {} ;:'".,<>?«»'’ ''])) (4认同)
  • 以及我们如何在preg中使用此正则表达式?我的意思是,因为它具有`“`和`'`,所以代码无法正常工作,例如:`preg_match('(?i)\ b ......]))',$ str)`-全部代码似乎已被注释。 (3认同)