如何创建考虑到主题由多行组成的正则表达式?
一个的“m
”修饰符似乎不起作用。
最佳答案
Maxwell Troy Milton King 是对的,但由于他的回答有点简短,我也将其发布并提供一些示例来说明。
首先,.
元字符默认不匹配换行符。许多正则表达式实现都是如此,包括 PHP 的风格。也就是说,拿文字:
$text = "Line 1\nLine 2\nLine 3";
和正则表达式
'/.*/'
那么正则表达式将只匹配第 1 行
。自己看看:
preg_match('/.*/', $text, $match);
echo $match[0]; // echos: 'Line 1'
因为 .*
在 \n
(新行字符)处“停止匹配”。如果你想让它也匹配换行符,请在正则表达式的末尾附加 s-修饰符(又名 DOT-ALL 修饰符):
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”)都匹配。
关于PHP preg_replace 匹配多行的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2240348/