\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)
Unicode改行シーケンスに一致させるため。 ASCII
の範囲外の改行文字と、行区切り文字(U+2028
)と段落区切り文字(U+2029
)の両方を含めて、u
(unicode)フラグ。
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)
文字列の改行を示すための5つの異なる規則がサポートされています。
(*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
の任意の組み合わせに一致します。
更新:
\v
と比較して\R
の範囲を明確にするために、 perlrebackslash から
- \ R
\R
は一般的な改行に一致します。つまり、Unicodeで改行シーケンスと見なされるものはすべてです。 これには、\v
(垂直方向の空白)、...に一致するすべての文字が含まれます。
パターンでリテラル[\r\n]
を使用できないような奇妙な要件がある場合は、代わりに常に16進エスケープシーケンスを使用できます。
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);
_
この正規表現は、改行\n
およびキャリッジリターン\r
文字にも一致します。
(?![ \t\f])\s
1つ以上の改行文字またはキャリッジリターン文字を照合するには、以下の正規表現を使用できます。
(?:(?![ \t\f])\s)+
問題は、複数行オプション、またはドットを使用する場合は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 );