【问题标题】:How to preg_match for a specific pattern in a url?如何为 url 中的特定模式 preg_match?
【发布时间】:2013-05-04 00:05:22
【问题描述】:

我想在 PHP 中使用 preg_match 来测试 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;

但有些地方不太对劲。有什么想法吗?

【问题讨论】:

  • “不太正确”是什么意思?“不太正确”不足以让我们理解问题。当你尝试它时发生了什么?你得到不正确的结果吗?您得到 no 结果了吗?如果结果不正确,是什么导致它们不正确?你期待什么?你得到任何正确的结果了吗?如果是这样,它们是什么?不要让我们猜测。
  • 对不起。 “不太正确”是指它不匹配,但我觉得我很接近!

标签: php regex url preg-match segments


【解决方案1】:

试试:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      这应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 2014-03-23
        • 1970-01-01
        相关资源
        最近更新 更多