我已经测试了\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的换行符,但是可以使用不同的替代方案来进行配置。
要匹配任何在ASCII
范围内的Unicode换行符序列。
preg_match('~\R~', $string);
这相当于以下组:
(?>\r\n|\n|\r|\f|\x0b|\x85)
preg_match('~\R~u', $string);
u
(unicode) 修饰符打开 PCRE 的附加功能,模式字符串被视为 (UTF-8)。(?>\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”。\R
。仅限学术目的,如果您不在 u
模式下,则可以发明另一种匹配 \r
或 \n
的方法,而不使用它们:(?![ \t\cK\f])\s
为什么?因为 \s
匹配 [ \t\cK\f\r\n]
,所以这是一种类减法。 :) - zx81u
模式修饰符?在输入字符串中读取多字节字符时,您需要告诉正则表达式引擎。 - mickmackusa~\R~
中的波浪线是转义序列的一部分。其实这些波浪线只是分隔符,通常情况下使用的是 /
。所以有趣的部分只有 \R
。 - Tyler Collier这并没有回答关于替代方案的问题,因为\v
可以完美地工作。
\v
匹配任何被认为是垂直空白的字符;这包括平台的回车和换行符(newline)以及其他几个字符,全部列在下表中。
您只需要将"#\v+#"
更改为以下之一:
"#\\v+#"
转义反斜杠或者
'#\v+#'
使用单引号在两种情况下,您都将得到\r
和\n
的任意组合的匹配。
更新:
只是为了明确\v
的范围与\R
相比较,来自perlrebackslash
- \R
\R
匹配通用换行符;也就是说,Unicode认为是换行序列的所有内容。这包括所有\v
匹配的字符(垂直空白),...
如果有一些奇怪的需求阻止你在模式中使用字面上的[\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);
在 PHP 中匹配换行符,请使用 php 常量 PHP_EOL
。这是跨平台的。
if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
print_R($matches );
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";
^
和 $
)的行为,使它们在行边界(即行分隔符之前和之后)匹配。OP 的正则表达式并不包含任何锚点。 - Alan Moore
\s+
,我猜。你不想使用\r\n
的原因是什么? - Jerry\r\n
的方法,而\s
可以匹配。 - Jerry\R
代替\s
。 - hwnd