有没有一种方法可以在多行上写入REGEX模式



我经常使用超复杂和长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演示。

相关内容

  • 没有找到相关文章

最新更新