1

この質問は、splitの代わりにpreg_splitを使用するのと非常に似ていますが、クリアするために生きている正規表現といくつかの混乱があります。

代わりにpreg_split()を使用するようにいくつかの既存のsplit()関数を更新しようとすると、不明確な結果が得られます。以下のコードを実行すると、さまざまな長さの配列が得られますが、その理由はわかりません。

私が見ることができることから、splitは\nで可能な\rと事前に一致しています。そして、preg_splitも同じことをしていると思いますが、なぜ2つの分割を作成するのでしょうか。これは怠惰な/貪欲なマッチングと関係がありますか?

デモコード:

$test = "\r\n";

$val = split('\r?\n', $test); //literal interpretation of string
$val_new = split("\r?\n", $test); //php understanding that these are EOL chars
$val2 = preg_split('/\r?\n/', $test);

var_dump($val); // returns array(1) { [0]=> string(2) " " }
var_dump($val2); // returns array(2) { [0]=> string(0) "" [1]=> string(0) "" }

編集:Kolinksのコメントに基づいて$ val_newに追加されました。これは、問題の理解を深めるのに役立ち、他の人にも役立つ可能性があるためです。

4

2 に答える 2

2

分割配列内の空のトークンを無視するには、PREG_SPLIT_NO_EMPTYの3番目の引数としてフラグを立てる必要があります。preg_splitだからあなたが使うなら

preg_split('/\r?\n/', $test, PREG_SPLIT_NO_EMPTY);

その後、分割関数と同じように動作します。

ちなみに、\r?\nin split関数を使用しても、分割は行われず(splitは理解できず\r\n一重引用符で囲まれているため)、元の文字列を返します。

編集:または、二重引用符で分割を使用することもできます正規表現:

split("\r?\n", $test);

文字列を2つの要素の配列に分割します。

于 2012-04-23T16:18:22.513 に答える
1

splitは特殊文字として理解しません\r。また\n、一重引用符を使用したため、PHPはそれらを特殊文字としても扱いません。だから文字通りまたはsplitを探しています。\\n\r\n

preg_split一方、は特殊文字として理解\r\nます。そのため、PHPはそれらをPCREのように処理しないため、文字列は正しく分割されます。

これは、怠惰な/貪欲なマッチングとは何の関係もありません。それはすべて、一重引用符\r\nが改行の意味に解析されないためです。

于 2012-04-23T16:21:27.347 に答える