答案 0 :(得分:4)
^[A-Za-z0-9][A-Za-z0-9.-]+(:\d+)?(/.*)?$
":8080"
)思考:
$
”如果您的正则表达式支持它,您可以将上述内容缩短为:
^[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);