在PHP中使用和不使用协议重新编写URL

时间:2011-08-03 22:29:21

标签: php regex

所以我有这个URL正则表达式:

  

/(:((:[^ - /“':= A-Z0-9_ @!] | ^ | \:????))((HTTPS://)((:[^ \ p {p} \ p {螺} \ S] .- |。?[^ \ p {p} \ p {螺} \ S])+ [AZ] {2,}(:: [0-9] +) ?)(/((([A-Z0-9 *! ';:= + \ $ /%#[] -_,〜]!+))| @ [A-Z0-9 *'? ;:= + \ $ /%#[] -_, - ] + / | [\](:[A-Z0-9 *';:?!= + \ $ /%#[] -_ 〜] |))* [A-Z0-9 =#/])(\ [A-Z0-9 *'()(\ S?!);:???!&安培; = + \ $ /% #[] -_,〜] * [A-Z0-9_&安培;?=#/])))/度:iux

目前匹配的内容:

我需要它也匹配:

  • www.google.com
  • google.com

我尝试通过拍打?使正则表达式的协议部分可选?在结尾“(https?:\ / \ /)?”但那没有做任何事情。

想法?

1 个答案:

答案 0 :(得分:3)

我会用你正在使用的语言寻找一些东西。 URL很难与正则表达式匹配。如果你坚持,我改变你的(https?://)可选。我没有检查它。

/(?:((?:[^-/"':!=a-z0-9_@]|^|\:))((https?://)?((?:[^\p{P}\p{Lo}\s].-|[^\p{P}\p{Lo}\s])+.[a-z]{2,}(?::[0-9]+)?)(/(?:(?:([a-z0-9!*';:=+\$/%#[]-_,~]+))|@[a-z0-9!*';:=+\$/%#[]-_,~]+/|[.\,]?(?:[a-z0-9!*';:=+\$/%#[]-_~]|,(?!\s)))*[a-z0-9=#/]?)?(\?[a-z0-9!*'();:&=+\$/%#[]-_.,~]*[a-z0-9_&=#/])?))/iux

我从the RFC 3986得到了这个例子,并由this comment指示。虽然,我仍然建议使用你正在使用的任何语言而不是正则表达式的东西。

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

由于您使用的是PHP,您是否考虑使用parse_url?看起来它会在坏网址上返回false。