web-dev-qa-db-ja.com

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に一致する他の代替手段はありますか?

15
Jason OOO

PCREと改行

[〜#〜] pcre [〜#〜] には、改行に関連するエスケープシーケンスと代替が過剰にあります。

ここで使用できる気の利いたエスケープシーケンスは\Rです。デフォルトでは、\RはUnicode改行シーケンスに一致しますが、さまざまな代替手段を使用して構成できます。

ASCIIの範囲にあるUnicode改行シーケンスに一致します。

preg_match('~\R~', $string);

これは、次のグループと同等です。

(?>\r\n|\n|\r|\f|\x0b|\x85)

Unicode改行シーケンスに一致させるため。 ASCIIの範囲外の改行文字と、行区切り文字(U+2028)と段落区切り文字(U+2029)の両方を含めて、uunicode)フラグ。

preg_match('~\R~u', $string);

uunicode)修飾子はPCREの追加機能をオンにし、パターン文字列は(UTF-8)。

これは、次のグループに相当します。

(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})

\RCRLF、または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」として扱われます。

37
hwnd

\v は完全に機能するため、これは代替案の質問には答えません。

\vは、垂直方向の空白と見なされるすべての文字に一致します。 これには、プラットフォームのキャリッジリターンとラインフィード文字(改行)に加えて、他のいくつかの文字が含まれます。これらはすべて以下の表にリストされています。

"#\v+#"をどちらかに変更するだけです

  • "#\\v+#"バックスラッシュをエスケープする

または

  • '#\v+#'一重引用符を使用

どちらの場合も、\r\nの任意の組み合わせに一致します。

更新:

\vと比較して\Rの範囲を明確にするために、 perlrebackslash から

  • \ R
    \Rは一般的な改行に一致します。つまり、Unicodeで改行シーケンスと見なされるものはすべてです。 これには、\v(垂直方向の空白)、...に一致するすべての文字が含まれます。
7
Olaf Dietsche

パターンでリテラル[\r\n]を使用できないような奇妙な要件がある場合は、代わりに常に16進エスケープシーケンスを使用できます。

preg_match('#[\xD\xA]+#', $string)

これは、[\r\n]+と同等のパターンです。

5
p.s.w.g

特定の文字列のすべての行を一致させるには、_^$_アンカーを使用して、正規表現エンジンに複数行モードで動作するようにアドバイスします。次に、_^$_は、文字列全体の開始と終了ではなく、各行の開始と終了に一致します。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

pHPでは、パターンの後のm修飾子になります。 /^(.*?)$/mは、指定された文字列内の垂直方向のスペースで区切られた、各行に単純に一致します。

ところで:行分割の場合、split()と_PHP_EOL_定数を使用することもできます。

_$lines = explode(PHP_EOL, $string);
_
1
dognose

この正規表現は、改行\nおよびキャリッジリターン\r文字にも一致します。

(?![ \t\f])\s

[〜#〜]デモ[〜#〜]

1つ以上の改行文字またはキャリッジリターン文字を照合するには、以下の正規表現を使用できます。

(?:(?![ \t\f])\s)+

[〜#〜]デモ[〜#〜]

0
Avinash Raj

問題は、複数行オプション、またはドットを使用する場合は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";
0
beiller

PHPで改行を照合するには、php定数PHP_EOLを使用します。これはクロスプラットフォームです。

if (preg_match('/\v+' . PHP_EOL ."/", $text, $matches ))
   print_R($matches );
0
Byron Whitlock