2

PHPで正規表現を学習し、preg_split関数をいじり回そうとしています。

しかし、それは正しくないようです、または私の理解は完全に間違っています。

私が使用しているテストコードは次のとおりです。

$string = "test ing ";
var_dump(preg_split('/t/', $string));

次のような配列を取得することを期待します。

[0] => "es" [1] => " ing "

しかし、以下が返されます:

[0] => "" [1] => "es" [2] => " ing "

なぜ最初に空の文字列があるのですか?

PREG_SPLIT_NO_EMPTYフラグを使用してこれをフィルタリングできることは理解していますが、そもそもそこにあるべきではありません。それが必要ですか?

4

3 に答える 3

2

なぜそうすべきではないのですか?これはまさにそれがどのように機能するかです。操作のセマンティクスは、split次の形式の文字列があることです。

value-delimiter-value-delimiter-value-...-delimiter-value

(区切り文字ではなく、値で開始および終了していることに注意してください。)

したがって、文字列が区切り文字で始まる場合、その区切り文字の前に空の値があると想定することは絶対に有効です(区切り文字は何かを2つに分割することになっているため)。通常、2つの連続するsの間の空の文字列も拒否したくないtでしょう。

そして、これがまさにそのPREG_SPLIT_NO_EMPTY目的です。それらの空の文字列を取り除きたいときはいつでもそれを使用します。

デフォルトの動作が必要な理由の簡単な例として、CSVファイルについて考えてみてください。(たとえば)で行を分割したい;。通常、空の値も許可する必要があります。ここで、最初の列の値が空の場合(つまり、行がで始まり;最初の空の文字列を完全に切り取った場合、結果の配列のすべてのインデックスが突然異なる列に対応するようになります。これが、これらを保持する理由です。空の文字列も同様です。多くの場合、区切り文字の数、つまり値の数がわかっているので、どの値がどの位置に属しているかを識別できるようにする必要があります。空の文字列もあります。

于 2012-10-29T20:06:04.870 に答える
0

100%正しく機能しています。最初の文字は「t」であるため、最初にその「t」で分割されます。最初の「t」の前には何もないため、配列の結果は空の文字列のエントリで始まります。

于 2012-10-29T20:06:27.500 に答える
0

t文字列の先頭にあるために発生しています。PREG_SPLIT_NO_EMPTYこのオプションを使用しない場合、preg_splitは空の文字列を有効な分割として扱います。

このように考えてください。どこでも、をpreg_split見るとt、文字列を2つのチャンクに分割します。前のtチャンクと後のチャンクです。チャンクの1つに何も含まれていない場合でも、カウントされます。その部分は単なる空の文字列です。

一部のアプリケーションでは、これは完全に役立ちます。たとえば、それぞれtを何かに置き換えたいが、置き換えが複雑すぎて、を使用できない場合preg_replaceなどです。言語はあなたが選択できることを望んでいるので、明示的に指定しない限り、空の分割を保持しますPREG_SPLIT_NO_EMPTY

于 2012-10-29T20:08:24.383 に答える