提问人:Mark Biek 提问时间:8/22/2008 最后编辑:fabrikMark Biek 更新时间:9/18/2018 访问量:1031
将带注释的多行(自由空间)正则表达式传递给preg_match
Passing a commented, multi-line (freespace) regex to preg_match
问:
我有一个正则表达式,最终会有点长,如果把它放在多行上,它会更容易阅读。
我试过这个,但它只是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赞
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);
评论