Jas*_*OOO 15 php regex pcre newline
我已经测试了\v(垂直空白区域)匹配\r\n和它们的组合,但我发现\v它不匹配\r和\n.以下是我正在使用的代码..
$string = "
Test
";
if (preg_match("#\v+#", $string )) {
echo "Matched";
} else {
echo "Not Matched";
}
Run Code Online (Sandbox Code Playgroud)
更清楚的是,我的问题是,是否有其他替代品可供选择\r\n?
hwn*_*wnd 37
PCRE具有多种与换行有关的转义序列和替代方案.
好吧,你可以在这里使用一个漂亮的转义序列\R.默认情况下,\R它将匹配Unicode换行符序列,但可以使用不同的替代方案进行配置.
匹配ASCII范围内的任何Unicode换行序列.
preg_match('~\R~', $string);
Run Code Online (Sandbox Code Playgroud)
这相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
Run Code Online (Sandbox Code Playgroud)
匹配任何Unicode换行序列; 包括ASCII范围之外的换行符以及行分隔符(U+2028)和段落分隔符(U+2029),您要打开u(unicode)标志.
preg_match('~\R~u', $string);
Run Code Online (Sandbox Code Playgroud)
的u(unicode的)改性剂导通的PCRE附加功能和模式字符串被视为(UTF-8 ).
相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})
Run Code Online (Sandbox Code Playgroud)
它可以限制\R匹配CR,LF或CRLF只:
preg_match('~(*BSR_ANYCRLF)\R~', $string);
Run Code Online (Sandbox Code Playgroud)
相当于以下组:
(?>\r\n|\n|\r)
Run Code Online (Sandbox Code Playgroud)
支持五种不同的约定来指示字符串中的换行符:
(*CR) carriage return
(*LF) linefeed
(*CRLF) carriage return, followed by linefeed
(*ANYCRLF) any of the three above
(*ANY) all Unicode newline sequences
Run Code Online (Sandbox Code Playgroud)
注意:\R在字符类中没有特殊含义.与其他无法识别的转义序列一样,默认情况下它被视为文字字符"R".
这并没有回答替代品的问题,因为\v效果非常好
\v匹配任何被认为是垂直空格的字符; 这包括平台的回车符和换行符(换行符)以及其他几个字符,全部列在下表中.
您只需要更改"#\v+#"为
"#\\v+#" 逃避反斜杠要么
'#\v+#' 使用单引号在这两种情况下,你会得到的任意组合的匹配\r和\n.
更新:
从perlrebackslash\v开始\R,只是为了明确范围
- \ R
\R匹配通用换行符; 也就是说,任何被Unicode视为换行序列的东西.这包括与\v(垂直空白)匹配的所有字符,......
如果有一些奇怪的要求阻止您[\r\n]在模式中使用文字,则可以始终使用十六进制转义序列:
preg_match('#[\xD\xA]+#', $string)
Run Code Online (Sandbox Code Playgroud)
这是模式相当于[\r\n]+.