将注释的多行(自由空间)正则表达式传递给preg_match

时间:2008-08-22 14:49:36

标签: php regex

我有一个正则有限的正则表达式,它会让你更容易阅读以跨越多行。

我尝试了这个,但它只是barfs。

preg_match(
    '^J[0-9]{7}:\s+
    (.*?)             #Extract the Transaction Start Date msg
    \s+J[0-9]{7}:\s+Project\sname:\s+
    (.*?)             #Extract the Project Name
    \s+J[0-9]{7}:\s+Job\sname:\s+
    (.*?)             #Extract the Job Name
    \s+J[0-9]{7}:\s+',
    $this->getResultVar('FullMessage'),
    $atmp
);

是否有办法将上述表单中的正则表达式传递给preg_match?

5 个答案:

答案 0 :(得分:5)

您可以使用扩展语法:

preg_match("/
    test
/x", $foo, $bar);

答案 1 :(得分:3)

是的,您可以添加/x Pattern Modifier

  

这个修饰符会打开另外一个   PCRE的功能是   与Perl不兼容。任何反斜杠   在一个模式后面跟着一个   那封没有特别意义的信   导致错误,从而保留这些错误   未来扩张的组合。通过   默认情况下,如在Perl中,反斜杠   接下来没有特别的信   意义被视为文字。那里   目前没有其他功能   由此修饰符控制。

对于您的示例,请尝试以下操作:

preg_match('/
              ^J[0-9]{7}:\s+
              (.*?)             #Extract the Transaction Start Date msg
              \s+J[0-9]{7}:\s+Project\sname:\s+
              (.*?)             #Extract the Project Name
              \s+J[0-9]{7}:\s+Job\sname:\s+
              (.*?)             #Extract the Job Name
              \s+J[0-9]{7}:\s+
            /x', $this->getResultVar('FullMessage'), $atmp);

答案 2 :(得分:1)

好的,这是一个解决方案:

preg_match(
                '/(?x)^J[0-9]{7}:\s+
                (.*?)             #Extract the Transaction Start Date msg
                \s+J[0-9]{7}:\s+Project\sname:\s+
                (.*?)             #Extract the Project Name
                \s+J[0-9]{7}:\s+Job\sname:\s+
                (.*?)             #Extract the Job Name
                \s+J[0-9]{7}:\s+/'
                , $this->getResultVar('FullMessage'), $atmp);

键的开头是(?x),这使得空格无关紧要并允许注释。

在起始和结束引号与开始和结束之间没有空格也很重要。正则表达式结束。

我的第一次尝试给出了错误:

preg_match('
                /(?x)^J[0-9]{7}:\s+
                (.*?)             #Extract the Transaction Start Date msg
                \s+J[0-9]{7}:\s+Project\sname:\s+
                (.*?)             #Extract the Project Name
                \s+J[0-9]{7}:\s+Job\sname:\s+
                (.*?)             #Extract the Job Name
                \s+J[0-9]{7}:\s+/
           ', $this->getResultVar('FullMessage'), $atmp);

什么Konrad said也起作用,感觉比开始时坚持(?x)更容易。

答案 3 :(得分:1)

  • 你应该添加分隔符:正则表达式的第一个字符将用于表示模式的结束。
  • 您应该添加'x'标志。这与在开始时放置(?x)具有相同的结果,但它更具可读性。

答案 4 :(得分:0)

在PHP中,注释语法如下所示:

(?# Your comment here)

preg_match('
            ^J[0-9]{7}:\s+
            (.*?)             (?#Extract the Transaction Start Date msg)
            \s+J[0-9]{7}:\s+Project\sname:\s+
            (.*?)             (?#Extract the Project Name)
                \s+J[0-9]{7}:\s+Job\sname:\s+
            (.*?)             (?#Extract the Job Name)
            \s+J[0-9]{7}:\s+
            ', $this->getResultVar('FullMessage'), $atmp);

有关详细信息,请参阅PHP Regular Expression Syntax Reference

您也可以使用PCRE_EXTENDED(或'x')Pattern Modifier,如Mark在其示例中所示。