用于部件捕获的url验证的正则表达式

时间:2009-01-14 02:42:07

标签: regex validation url

可以使用单个正则表达式来修改网址并匹配所有部分,我一直在研究一个,到目前为止我提出的是:

(?:(?P<scheme>[a-z]*?)://)?(?:(?P<username>.*?):?(?P<password>.*?)?@)?(?P<hostname>.*?)/(?:(?:(?P<path>.*?)\?)?(?P<file>.*?\.[a-z]{1,6})?(?:(?:(?P<query>.*?)#?)?(?P<fragment>.*?)?)?)?

但是这不起作用,它应该匹配以下所有示例:

  

http://username:password@hostname.tld/path?arg=value#anchor
  http://www.domain.com/
  http://www.doamin.co.uk/
  http://www.yahoo.com/
  http://www.google.au/
  https://username:password@domain.com/
  ftp://user:password@domain.com/path/
  https://www.blah1.subdoamin.doamin.tld/
  使用domain.tld /#锚
  doamin.tld /?查询= 123
  domain.co.uk/
  使用domain.tld
  http://www.domain.tld/index.php?var1=blah
  http://www.domain.tld/path/to/index.ext
  的mailto://user@unkwndesign.com

并为所有组件提供命名捕获:

  

计划,例如。 http https ftp ftps callto mailto和任何其他未列出的内容   用户名
  密码
  主机名包括子域,域和tld
  路径例如/ images / profile /
  文件名,例如file.ext
  查询字符串例如。 ?富=栏&安培;巴= FOO
  片段,例如。 #anchor

将主机名作为唯一的必填字段。

我们可以假设这是来自特定要求提供网址的表单,并且不会用于在文本中查找链接。

2 个答案:

答案 0 :(得分:12)

  

可以使用单个正则表达式来确定网址并匹配所有部分

没有

strager的正则表达式令人印象深刻,但在一天结束时,它比仅使用正确的URI解析器更不易读,可维护和可靠。它必然拒绝有效的URI并接受非URI的字符串,因为格式化URI的规则无法在正则表达式中完全表达。

  

的mailto://user@unkwndesign.com

mailto URI中不应该有'//'。在您阅读该方案之前,您无法分辨URI的余数(post-:)将采用何种格式;许多URI方案不符合凭证@host / path格式。最好只接受您知道如何解析其URI的特定方案。

答案 1 :(得分:6)

mingfai's regular expression的修改版本:

/^((?P<scheme>https?|ftp):\/)?\/?((?P<username>.*?)(:(?P<password>.*?)|)@)?(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?(?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?$/