我已经测试\v
了(垂直空白)匹配\r\n
及其组合,但我发现\v
不匹配\r
和\n
. 下面是我正在使用的代码..
$string = "
Test
";
if (preg_match("#\v+#", $string )) {
echo "Matched";
} else {
echo "Not Matched";
}
更清楚地说,我的问题是,还有其他选择\r\n
吗?
PCRE具有过多的换行相关转义序列和替代方案。
好吧,你可以在这里使用的一个漂亮的转义序列是\R
. 默认情况下\R
将匹配 Unicode 换行符序列,但可以使用不同的替代方案进行配置。
匹配范围内的任何 Unicode 换行序列ASCII
。
preg_match('~\R~', $string);
这相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
匹配任何 Unicode 换行序列;包括范围外的换行符ASCII
以及行分隔符 ( U+2028
) 和段落分隔符 ( U+2029
),您要打开u
( unicode ) 标志。
preg_match('~\R~u', $string);
( unicode ) 修饰符打开 PCRE 的附加功能,并且 Pattern 字符串被视为 ( u
UTF -8 )。
相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
可以限制\R
为 match CR
、LF
或CRLF
仅:
preg_match('~(*BSR_ANYCRLF)\R~', $string);
相当于以下组:
(?>\r\n|\n|\r)
支持在字符串中指示换行符的五种不同约定:
(*CR) carriage return
(*LF) linefeed
(*CRLF) carriage return, followed by linefeed
(*ANYCRLF) any of the three above
(*ANY) all Unicode newline sequences
注意:\R
在字符类中没有特殊含义。与其他无法识别的转义序列一样,默认情况下它被视为文字字符“R”。
如果有一些奇怪的要求阻止您[\r\n]
在模式中使用文字,您始终可以使用十六进制转义序列:
preg_match('#[\xD\xA]+#', $string)
这是模式等价于[\r\n]+
。
要匹配给定字符串的每一行,只需使用^$
锚点并建议您的正则表达式引擎以多行模式运行。然后^$
将匹配每一行的开始和结束,而不是整个字符串的开始和结束。
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
在 PHP 中,这将是m
模式之后的修饰符。/^(.*?)$/m
将简单匹配每一行,由给定字符串内的任何垂直空间分隔。
顺便说一句:对于分行,您还可以使用split()
和PHP_EOL
常量:
$lines = explode(PHP_EOL, $string);
问题是您需要 multiline 选项,如果使用 dot,则需要 dotall 选项。它位于分隔符的末尾。
http://www.php.net/manual/en/regexp.reference.internal-options.php
$string = "
Test
";
if(preg_match("#\v+#m", $string ))
echo "Matched";
else
echo "Not Matched";
要匹配 PHP 中的换行符,请使用 php 常量PHP_EOL
。这是跨平台的。
if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
print_R($matches );