如何preg_match在网址中的特定模式?

时间:2013-05-09 13:31:59

标签: php regex url preg-match segments

我想在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;

但事情并不完全正确。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

尝试:

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

\d[0-9]的缩写,您可以使用不同的开始/结束分隔符(在本例中使用!),以便在尝试匹配斜杠时使正则表达式更具可读性。

答案 1 :(得分:0)

虽然你有一些小问题,但看起来你的情况几乎是正确的

  1. 你忘了在page.html
  2. 之前逃过你的最后一个“/”
  3. [。] +应该是[^。] +,你不是在寻找一个或多个时期,你正在寻找任何不是一段时期的东西。
  4. 你不应该使用[]来匹配html,而是使用()或者根本没有
  5. if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/([^.]+.html)$", $_SERVER['REQUEST_URI'])) :
        echo "match";
    endif;
    

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

答案 2 :(得分:0)

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

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

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

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

那应该可以解决问题。