【问题标题】:Regex doesn't work with multi line正则表达式不适用于多行
【发布时间】:2009-09-18 19:19:57
【问题描述】:
$regpattern4 = "!<media:description type='plain'> (.*) <\/media:description>!";

我正在解析一个 XML 文档。如果描述中没有换行符,上面的正则表达式可以工作,但是即使有换行符,我该如何让它工作?

【问题讨论】:

  • 考虑使用 DOM 来解析 XML。它将比正则表达式更好地处理边缘情况。
  • 在正斜杠之前你真的不需要反斜杠...

标签: php regex multiline


【解决方案1】:

您可能会对手册页“Pattern Modifiers”感兴趣,尤其是 s (PCRE_DOTALL) 修饰符:

如果设置了这个修饰符,一个点 模式匹配中的元字符 所有字符,包括换行符。 没有它,换行符被排除在外。 这个修饰符相当于 Perl 的 /s 修饰符。负类,例如 [^a] 总是匹配换行符 字符,独立于设置 这个修饰符。

你的正则表达式会变成这样:

$regpattern4 = "!<media:description type='plain'> (.*) <\/media:description>!s";

请注意,我在结束分隔符后添加了“s”修饰符。

【讨论】:

    【解决方案2】:

    为什么要使用正则表达式来解析 xml?为什么不使用 simplexml_load_string 来加载 XML 文档并“遍历”它。除非您希望进行简单的替换,否则它将比复杂的正则表达式语句更不容易出错。

    【讨论】:

      【解决方案3】:

      试试

       preg_match("/pattern/s", $text)
      

      【讨论】:

        【解决方案4】:

        您需要添加s (DOTALL) modifier:

        $regpattern4 = "!(.*)<\/media:description>!s";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-01
          • 2020-07-07
          • 2013-09-08
          • 2019-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多