我经常使用超复杂和长regexp。PCRE@PHP。
很长一段时间以来,我一直在寻找一种方法来做一些事情,比如:
preg_match('#blablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablablablablabla...
blablabla#uis');
代替:
preg_match('#blablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablablablablabla...blablabla#uis');
如果我进行实际的换行,它将成为正则表达式的一部分。也许不是作为实际的换行符,而是作为空白。除非我完全错了。
是否有一些字符我可以在每一行的末尾说:";这应该都是一行";?
您可以使用支持变量插值的HEREDOC(或不支持变量插补的NOWDOC(和x
标志(修饰符(。查看文档对量词的描述:
x(PCRE_EXTENDED(
如果设置了此修饰符,则模式中的空白数据字符将被完全忽略,除非转义或在字符类内,并且字符类外的未转义#和下一个换行符(包括换行符(之间的字符也将被忽略。这相当于Perl的/x修饰符,可以在复杂的模式中包含注释。但是,请注意,这仅适用于数据字符。空白字符可能永远不会出现在模式中的特殊字符序列中,例如在序列(?(中(它引入了一个条件子模式.
// HEREDOC
$pattern_with_interpolation = <<<EOD
/
blablabla... # comment here
blablabla # comment here
/uisx
EOD;
// NOWDOC
$pattern_without_interpolation = <<<'EOD'
/blablabla... # comment here
blablabla # comment here
/uisx
EOD;
请注意您需要转义模式中的所有#
和文字空白字符,因为/x
标志允许在#
之后的行末使用注释,并插入任何具有格式含义的文字空白,它们与相应的字符不匹配。
示例
$pattern_without_interpolation = <<<'EOD'
/
d+ # one or more digits
# a single space
p{L}+ # one or more letters
# # a literal hash symbol
/ux
EOD;
if (preg_match($pattern_without_interpolation, '1 pound#', $m)) {
echo $m[0];
}
// => 1 pound#
请参阅PHP演示。