【问题标题】:PHP regex to search across multiple linesPHP正则表达式搜索多行
【发布时间】:2011-02-21 17:23:06
【问题描述】:

我在 PHP 中使用 preg_* 搜索模式 <!-- %{data=THIS GETS MATCHED}% --> 并提取匹配的文本。

这个模式是:

preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#', ...)

我想做的是跨多行搜索字符串。例如:

<!-- %{data=
THIS GETS
MATCHED AND
RETURNED
}% -->

如何编辑我当前的模式以获得这种搜索能力?

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    这似乎有效:

    <?php
        $testString = "<!-- %{data=
    THIS GETS
    MATCHED AND
    RETURNED
    }% -->";
        $knownString = "data";
        preg_match( "@<!-- %\\{" . $knownString . "\\s*=\\s*([^\\}]+)\\}% -->@", $testString, $match );
        var_dump( $match );
    ?>
    

    返回:

    array(2) {
      [0]=>
      string(54) "<!-- %{data=
    THIS GETS
    MATCHED AND
    RETURNED
    }% -->"
      [1]=>
      string(34) "THIS GETS
    MATCHED AND
    RETURNED
    "
    }
    

    【讨论】:

    • m 或多行模式改变了^$ 锚点的含义,使它们能够匹配行边界以及字符串的开头和结尾。您的正则表达式有效,因为您将点更改为([^\\}]m 无关紧要。
    【解决方案2】:

    你应该添加“s”pattern modifier,没有它的点匹配任何字符除了换行:

    preg_match('#<!-- %{' . $knownString . '\s*=\s*(.*?)}% -->#s', ...)
    

    【讨论】:

    • 在将 $knownString 粘贴到正则表达式的其余部分之前,我会使用 preg_quote() 保护它。
    【解决方案3】:

    preg_match('#&lt;!-- %{' . $knownString . '\s*=\s*(.*?)}% --&gt;#s', ...) 有效吗?

    我的工作 atm 没有 PHP,所以我无法测试它...

    【讨论】:

    • 我设法通过使用/&lt;!-- %{' . $knownString . '=\s*(.*?)}% --&gt;/s 让它工作。然而,我在正则表达式方面很糟糕,所以如果你正在考虑这种想法“......哈哈?”。请告诉我xD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多