正则表达式无效 URL,我的正则表达式规则有什么问题?

时间:2021-04-28 16:00:21

标签: php regex

我有一个针对网站 url 的正则表达式规则。 我不确定为什么以下内容不适用于我的正则表达式规则。 有人可以帮忙吗?

正则表达式:

$regex = '/^(?:https?:\/\/(?:www\.)?)?[a-z0-9]+(?:[-.][a-z0-9]+)*\.[a-z]{2,}(?::[0-9]{1,5})?(\/.*)?$/';

无效的网址格式:

https://game.game123.io?r=235ffw12105gawfwara2332FWWF66e1EA9121685aa

2 个答案:

答案 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
  • (?:[?/#].*)? 可选择匹配 ? /#
  • $ 字符串结束

Regex demo