如何使用PHP preg_match检查URL的结构?

How to check the URL's structure using PHP preg_match?

我网站的所有 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);
}

谢谢。

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

由于示例数据中有可选部分,您可以将 (/.*)?$ 替换为 (?:/[^\W\d]+(?:/\d+)?)?$

说明

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

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

模式可能看起来像

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

Regex demo

注意转义点以使其与字面匹配。