2

我有一个正则表达式,它最终会有点长,它会使它更容易阅读以跨多行。

我试过这个,但它只是呕吐。

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?

4

5 回答 5

5

您可以使用扩展语法:

preg_match("/
    test
/x", $foo, $bar);
于 2008-08-22T14:54:20.267 回答
3

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

此修饰符打开与 Perl 不兼容的 PCRE 的附加功能。模式中的任何反斜杠后面跟一个没有特殊含义的字母都会导致错误,因此保留这些组合以供将来扩展。默认情况下,就像在 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);
于 2008-08-22T14:59:36.353 回答
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);

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

于 2008-08-22T14:54:40.063 回答
1
  • 您应该添加分隔符:正则表达式的第一个字符将用于指示模式的结束。
  • 您应该添加“x”标志。这与将 (?x) 放在开头的结果相同,但恕我直言,它更具可读性。
于 2008-08-22T14:56:57.233 回答
0

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

(?# 你的评论在这里)

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 在他的示例中所示。

于 2008-08-22T14:56:35.707 回答