如何在没有方案的情况下为URL编写正则表达式?

时间:2009-06-09 16:06:04

标签: regex url

如何在没有方案的情况下编写验证URL的RE:

通过:

  • www.example.com
  • example.com

故障:

5 个答案:

答案 0 :(得分:4)

^[A-Za-z0-9][A-Za-z0-9.-]+(:\d+)?(/.*)?$
  • 字符串必须以ASCII字母或数字
  • 开头
  • ASCII字母,数字,点和短划线(不允许斜线或冒号)
  • 可选:允许端口(":8080"
  • 可选:斜杠之后的任何内容都可以跟随(因为您说“URL”)
  • 然后是字符串的结尾

思考:

  • 不允许换行
  • 无效或理智检查
  • 不支持“国际化域名”(IDN)
  • 如果您愿意,请取消“可选:”部分,但一定要包含最终的“$

如果您的正则表达式支持它,您可以将上述内容缩短为:

^[A-Za-z\d][\w.-]+(:\d+)?(/.*)?$

请注意,\w 可能在某些正则表达式中包含Unicode字符。此外,\w包含下划线,在主机名中无效。像第一个这样的明确方法会更安全。

答案 1 :(得分:1)

如果您尝试为某些实际代码执行此操作,请找到您的语言的URL解析库并使用它。如果您不想使用它,请查看内部以了解它的作用。

你称之为“资源”的东西被称为“方案”。它在RFC 1738中有记录,其中说:

  

[2.1] ...通常,URL编写如下:

   <scheme>:<scheme-specific-part>

URL包含所使用的方案的名称(&lt; scheme&gt;)    通过冒号然后是一个字符串(&lt; scheme-specific-part&gt;)    解释取决于计划。

后来在BNF,

  

scheme = 1 * [lowalpha |数字| “+”| “ - ”| “” ]

因此,如果有方案,您可以将其与:

匹配
/^[a-z0-9+.-]+:/i

如果匹配,则您拥有URL语法认为的方案,并且您的验证失败。如果您有包含端口号的字符串,例如www.example.com:80,那么事情会变得混乱。在实践中,我没有处理-.的方案,所以你可能会添加一个真实世界的软糖来解决这个问题,直到你决定使用一个合适的库。

除此之外的任何事情,比如检查现有的和可到达的域等等,最好留给已经全部用完的图书馆。

答案 2 :(得分:-1)

我的猜测是

/^[\p{Alnum}-]+(\.[\p{Alnum}-]+)+$/

更原始的RE语法

/^[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)+$/

或者甚至更原始:

/^[0-9A-Za-z-][0-9A-Za-z-]*\.[0-9A-Za-z-][0-9A-Za-z-]*(\.[0-9A-Za-z-][0-9A-Za-z-]*)*$/

答案 3 :(得分:-1)

网址语法为quite complex,您需要将其缩小一点。您可以匹配anything.ext,如果这足够的话:

^[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}$

答案 4 :(得分:-1)

谢谢大家,我想我有Python和PHP解决方案。他们在这里:

Python解决方案:

import re

url = 'http://www.foo.com'
p = re.compile(r'^(?!http(s)?://$)[A-Za-z][A-Za-z0-9.-]+(:\d+)?(/.*)?$')
m = p.search(url)
print m     # m returns _sre.SRE_Match if url is valid, otherwise None 

PHP解决方案:

$url = 'http://www.foo.com';
preg_match('/^(?!http(s)?:\/\/$)[A-Za-z][A-Za-z0-9\.\-]+(:\d+)?(\/\.*)?$/', $url);