PHP 的preg_replace匹配多行的正则表达式
如何创建一个考虑到主题由多行组成的正则表达式?
一个的“”修饰符似乎不起作用。m
Maxwell Troy Milton King是对的,但由于他的答案有点短,我也会发布这个并提供一些例子来说明。
首先,默认情况下,元字符与换行符不匹配。对于许多正则表达式实现都是如此,包括PHP的风格。也就是说,以文本为例:.
$text = "Line 1\nLine 2\nLine 3";
和正则表达式
'/.*/'
则正则表达式将仅匹配 。亲眼看看:Line 1
preg_match('/.*/', $text, $match);
echo $match[0]; // echos: 'Line 1'
因为“停止匹配”在(新行字符)。如果还想让它与换行符匹配,请在正则表达式的末尾附加 s 修饰符(也称为 DOT-ALL 修饰符):.*
\n
preg_match('/.*/s', $text, $match);
echo $match[0]; // echos: 'Line 1\nLine 2\nLine 3'
现在关于 m 修饰符(多行):这将使匹配不仅成为输入字符串的开头,还允许匹配每行的开头。与 :相同,它不仅会让匹配输入字符串的结尾,还会让每行的结尾。^
$
$
例如:
$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/[0-9]$/', $text, $matches);
print_r($matches);
这将仅匹配3(在输入的末尾)。但:
但启用 m 修饰符:
$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/[0-9]$/m', $text, $matches);
print_r($matches);
每行末尾的所有(单个)数字(“1”,“2”和“3”)都匹配。
尝试使用“s”修饰符。意思是“像对待一行一样对待”。
“m”允许使用 ^ 和 $ 行的开头和结尾。