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

Passing a commented, multi-line (freespace) regex to preg_match

提问人:Mark Biek 提问时间:8/22/2008 最后编辑:fabrikMark Biek 更新时间:9/18/2018 访问量:1031

问:

我有一个正则表达式,最终会有点长,如果把它放在多行上,它会更容易阅读。

我试过这个,但它只是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?

PHP 正则表达式

评论

0赞 Mark Biek 10/16/2008
有趣。用 + 分隔的标签在问题中单独显示它们,但在右侧显示组合的 AND 标签。

答:

5赞 Konrad Rudolph 8/22/2008 #1

您可以使用扩展语法:

preg_match("/
    test
/x", $foo, $bar);
1赞 Mark Biek 8/22/2008 #2

好的,这里有一个解决方案:

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);

康拉德说的话也奏效了,感觉比一开始坚持(?x)要容易一些。

0赞 Huppie 8/22/2008 #3

在 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 正则表达式语法参考

您还可以使用 PCRE_EXTENDED(或“x”)模式修饰符,如 Mark 在他的示例中所示。

1赞 rix0rrr 8/22/2008 #4
  • 您应该添加分隔符:正则表达式的第一个字符将用于指示模式的结束。
  • 您应该添加“x”标志。这与将 (?x) 放在开头的结果相同,但恕我直言,它更具可读性。
3赞 Joseph Pecoraro 8/22/2008 #5

是的,您可以添加图案修改器/x

此修饰符打开其他 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);