我正在尝试创建用于验证网址的正则表达式。我知道有许多先进的,但我想创建自己的学习目的。
到目前为止,我有一个运行良好的正则表达式,但是我想改进URI的TLD部分的验证,因为我觉得它还没有完成。
这是我的正则表达式(或在regexr上找到):
/^[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:._\+~#=]{2,256}\.[a-zA-Z]{2,6}\b([/#?]{0,1}([A-Za-z0-9-._~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)$/
适用于foo.com
或http://foo.com
或foo.co.uk
当您引入子域名或二级域名(例如co.uk
)时会出现问题,因为正则表达式会接受foo.co.u
或foo.co.
。
我确实尝试使用以下内容在最后.
之后选择子字符串:
/[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:._\+~#=]{2,256}[^.]{2,}$/
但这阻止我定义URI的path
规则。
如何确保最后一个.
之后但第一个/
,?
或#
之前的子字符串长度至少为2个字符?
答案 0 :(得分:1)
从我所看到的,你几乎就在那里。做了一些修改,似乎有效。
^(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9@:._\+~#=]{2,256}\.[a-zA-Z]{2,6}([/#?;]([A-Za-z0-9-._~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)?$
可以通过
稍微缩短^(http(s)?:\/\/)?(www\.)?[\w@:.\+~#=]{2,256}\.[a-zA-Z]{2,6}([/#?;]([-\w.~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)?$
(基本上只是调整你的正则表达式)
主要区别在于参数部分是可选的,但如果它在那里则必须以/#?;
之一开始。这部分也可能会被简化。
修改强>
经过一些实验后,我认为这个问题很简单,它会得到:
^(http(?:s)?:\/\/)?([-.~\w]+\.[a-zA-Z]{2,6})(:\d+)?(\/[-.~\w]*)?([@/#?;].*)?$
它还捕获单独的部分 - 方案,主机,端口,路径和查询/参数。