0

我想在 PHP 中使用 preg_match 来测试 URL 的格式。URL 如下所示:

/2013/09/05/item-01.html

我试图让它工作:

if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/[.]+[.html]$", $_SERVER['REQUEST_URI'])) :
    echo "match";
endif;

但有些事情不太对劲。有任何想法吗?

4

3 回答 3

0

尝试:

if (preg_match('!\d{4}/\d{2}/\d{2}/.*\.html$!', $_SERVER['REQUEST_URI'])) {
    echo 'match';
}

\d是缩写,[0-9]当您尝试匹配斜杠时,您可以使用不同的开始/结束分隔符(我使用 ! 在这种情况下)使正则表达式更具可读性。

于 2013-05-09T13:37:33.690 回答
0

看起来你对你所拥有的几乎是正确的,尽管你有一些小问题

  1. 您忘记在 page.html 之前转义最后一个“/”
  2. [.]+ 应该是 [^.]+,您不是在寻找 1 个或多个句点,而是在寻找任何不是句点的东西。
  3. 您不应该使用 [] 来匹配 html,而应该使用 () 或根本不使用
if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/([^.]+.html )$", $_SERVER['REQUEST_URI'])) :
    回声“匹配”;
万一;

此外,您可能应该了解何时使用 (),这些用于确保您在其中存储匹配的任何内容。在您的情况下,我不确定您是否要将每个目录都存储到文件之前。

于 2013-05-09T13:39:40.713 回答
0

我的猜测是你有一个文件路径的工作表达式,当你尝试添加文件名部分时它停止工作。

preg_match()需要指定一对分隔符;在表达式的每一端都有一个。看起来你有这些,但是你在分隔符之外的字符串末尾添加了额外的表达式(即文件名) 。这是无效的。

  "/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/[.]+[.html]$"
   ^                                  ^
your start delimiter             your end delimiter

您需要移动[.]+[.html]$当前位于结束分隔符之后的表达式代码,使其位于其中。

那应该可以解决问题。

于 2013-05-09T14:12:07.467 回答