猿问

正则表达式 - PHP - 匹配多级 URL 路径

我一直在尝试创建一个正则表达式来匹配 URL 路径的某个部分,但不可否认的是,我以前的正则表达式经验很少,并且在阅读了几个小时的各种正则表达式教程后,我似乎陷入了困境。此时我的错误可能非常简单,但我什至不确定要搜索什么以及我需要什么类型的正则表达式运算符(我查看了一大堆其他问题,虽然有些问题相似,但我没有找不到完全匹配)。

我必须匹配下面的任何 URL 路径:

/服务
/服务/
/服务/页面/2
/服务/页面/140/

但它不应与以下任何一项匹配:

/服务/页面
/servicesx/页面
/服务/
页面 /服务/页面/
/服务/页面
/服务/页面/2/
/服务/foo
/服务/foo/页面

我需要匹配斜杠 / 后跟“服务”,可选地后跟斜杠,然后精确地跟随页面和斜杠以及任意数量的数字和可选的尾部斜杠,或者如果不精确跟随,则不应跟随任何其他内容。

“page”后面应该始终有数字,否则“service”后面没有数字的“page”也是无效的,“services”后面不能有任何其他内容。

我一直在使用这个工具进行实验: https: //regex101.com/

到目前为止,我已经想出了这个正则表达式,它不起作用,因为它仍然匹配太多(它匹配“/services/”)。

\/\bservices\b\/?(?:page\/[0-9]+)?\/?

如果重要的话,我需要在 PHP 中使用正则表达式。

泛舟湖上清波郎朗
浏览 149回答 1
1回答

千万里不及你

您的正则表达式缺少字符串开头和结尾锚点,这就是它匹配/services/您不想匹配的 URL 的原因。此外,您不需要\b其中的断言,因为/之前和之后services意味着这\b将是正确的。最后,如果您更改分隔符(例如更改为~),则无需转义正则表达式中的正斜杠。这将做你想做的事:^/services/?(?:page/[0-9]+)?/?$regex101 演示
随时随地看视频慕课网APP
我要回答