我有一个针对网站 url 的正则表达式规则。 我不确定为什么以下内容不适用于我的正则表达式规则。 有人可以帮忙吗?
正则表达式:
$regex = '/^(?:https?:\/\/(?:www\.)?)?[a-z0-9]+(?:[-.][a-z0-9]+)*\.[a-z]{2,}(?::[0-9]{1,5})?(\/.*)?$/';
无效的网址格式:
https://game.game123.io?r=235ffw12105gawfwara2332FWWF66e1EA9121685aa
答案 0 :(得分:1)
首先感谢所有的答案,以下 2 条规则有效,我只是想知道哪种语法更好,因为它们似乎做同样的事情?
正则表达式 1
^(?:https?:\/\/(?:www\.)?)?[a-z0-9]+(?:[-.][a-z0-9]+)*\.[a-z]{2,}(?::[0-9]{1,5})?([?\/#].*)?$
正则表达式 2
^(?:https?:\/\/(?:www\.)?)?[a-z0-9]+(?:[-.][a-z0-9]+)*\.[a-z]{2,}(?::[0-9]{1,5})?(?:[?\/#].*)?$
语法 2 中 [?/#] 之前的附加 ?: 是否需要?
答案 1 :(得分:0)
该模式匹配 .
或 -
后跟 [a-z0-9]+
的重复。
完整的字符串不匹配,因为 ?r=
中有一个问号,但该模式要求在末尾的可选部分中有一个前导 /
。
您可以做的是匹配任何您允许在最后一个可选部分使用字符类 [?/#]
的字符,然后是该行的其余部分。
^(?:https?:\/\/(?:www\.)?)?[a-z0-9]+(?:[-.][a-z0-9]+)*\.[a-z]{2,}(?::[0-9]{1,5})?(?:[?/#].*)?$
^
字符串开头(?:https?:\/\/(?:www\.)?)?
可选匹配协议和可选 www.
[a-z0-9]+
匹配 1+ 一个字符 a-z 或数字 0-9(?:[-.][a-z0-9]+)*
可选择重复 -
或 .
并匹配 1+ 次字符 a-z 或数字 0-9\.[a-z]{2,}
匹配一个 .
和一个字符 a-z 的 2 次或更多次(?::[0-9]{1,5})?
可选匹配 :
和 1-5 位数字 0-9(?:[?/#].*)?
可选择匹配 ?
/
或 #
$
字符串结束