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

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

===============>>#1 票数:5 已采纳

您可以使用扩展语法:

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

===============>>#2 票数: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);

===============>>#3 票数: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)更容易。

===============>>#4 票数:1

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

===============>>#5 票数: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正则表达式语法参考

您还可以使用PCRE_EXTENDED(或“x”) 模式修改器,如Mark在其示例中所示。

  ask by Mark Biek translate from so

未解决问题?本站智能推荐: