首页 > 解决方案 > 如何使用 PHP preg_match 检查 URL 的结构?

问题描述

我所有网站的 URL 都具有以下结构:

https://www.example.com/section/item

其中section是一个单词,item是一个数字。

因此,可能的 URL 是:

https://www.example.com

https://www.example.com/section

https://www.example.com/section/item

通过 .htaccess,所有请求都转到index.php(路由)。

如果用户键入以下内容,我想显示 404 错误消息:

https://www.example.com/section/item/somethingelse

为了检查 URL 的结构,如何在以下函数中正确更改模式?

function isValidURL($url) {
    return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
}

谢谢。

标签: phpurlpreg-match

解决方案


如果 section 是一个单词(并且不能包含数字),并且 item 是一个数字,则可以使用[^\W\d]+and匹配除数字之外的单词字符\d+来匹配 1+ 位。

与示例数据一样,有可选部分,您可以替换(/.*)?$(?:/[^\W\d]+(?:/\d+)?)?$.

解释

  • (?:非捕获组
    • /[^\W\d]+对于部分,匹配 1+ 次除数字之外的单词字符
    • (?:/\d+)?对于项目,可选匹配/和 1+ 位数字
  • )?关闭非捕获组并使其可选

如果 section 可以是一个也可以只包含数字的单词,你也可以使用\w+

模式可能看起来像

^https?://[a-z0-9-]+(?:\.[a-z0-9-]+)*(?::[0-9]+)?(?:/[^\W\d]+(?:/\d+)?)?$

正则表达式演示

注意转义点以匹配它的字面意思。


推荐阅读