PHP 正则表达式:如何在不使用 [\r\n] 的情况下匹配 \r 和 \n?
我已经测试了(垂直空白)的匹配及其组合,但我发现不匹配和.以下是我正在使用的代码。\v
\r\n
\v
\r
\n
$string = "
Test
";
if (preg_match("#\v+#", $string )) {
echo "Matched";
} else {
echo "Not Matched";
}
更清楚的是,我的问题是,有没有其他选择可以匹配?\r\n
我已经测试了(垂直空白)的匹配及其组合,但我发现不匹配和.以下是我正在使用的代码。\v
\r\n
\v
\r
\n
$string = "
Test
";
if (preg_match("#\v+#", $string )) {
echo "Matched";
} else {
echo "Not Matched";
}
更清楚的是,我的问题是,有没有其他选择可以匹配?\r\n
PCRE 具有与换行符相关的转义序列和替代项的多余性。
好吧,您可以在此处使用的漂亮的转义序列是 。默认情况下,它将匹配 Unicode 换行符序列,但可以使用不同的替代项进行配置。\R
\R
匹配范围内的任何 Unicode 换行符序列。ASCII
preg_match('~\R~', $string);
这等效于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
匹配任何 Unicode 换行符序列;包括范围外的换行符以及行分隔符 () 和段落分隔符 (),您希望打开 (unicode) 标志。ASCII
U+2028
U+2029
u
preg_match('~\R~u', $string);
(unicode) 修饰符打开 PCRE 的附加功能,模式字符串被视为 (UTF-8)。u
等效于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
可以限制为匹配 、 或 仅匹配:\R
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
这并不能回答替代方案的问题,因为 \v
运行良好
\v
匹配任何被视为垂直空格的字符;这包括平台的回车符和换行符(换行符)以及其他几个字符,所有这些都在下表中列出。
您只需更改为"#\v+#"
"#\\v+#"
转义反斜杠或
'#\v+#'
使用单引号在这两种情况下,您都将获得 和 的任意组合的匹配项。\r
\n
更新:
只是为了使范围清楚比较,从perlrebackslash\v
\R
- \R
匹配一个泛型换行符;也就是说,Unicode 认为是换行序列的任何内容。这包括与\v
(垂直空格)匹配的所有字符,...\R