1

プロトコル ドキュメントに続いて、各パラメーターが空白で区切られた文字列としてエンコードされたパラメーターの配列を受け取ることができます。パラメータ内のスペースはバックスラッシュでエスケープされます。

したがって、パラメーター配列内に次の文字列があるとします。

array('Eli is beautiful', 'Fran is ugly', 'Oso is nice')

これらは、次のように 1 つの文字列にエンコードされます。

Eli\ is\ beautiful Fran\ is\ ugly Oso\ is\ nice

エンコーディングは大きな問題ではありませんが、デコーディングの問題に直面しています。

バックスラッシュの後にないスペースで分割する必要がある正規表現を使用してパラメーターを分割しようとしているので、これが私のコードです:

$params = preg_split('/[^\\\\]\s/', $str);

期待どおりにパラメーターを分割しますが、それぞれの最後の文字も削除するため、var_dump の出力は次のようになります。

array(3) {
  [0]=>
  string(15) "Eli is beautifu"
  [1]=>
  string(11) "Fran is ugl"
  [2]=>
  string(11) "Oso is nice"
}

誰かがこれを解決する方法を知っていますか?

ティア、

4

1 に答える 1

4

単純に否定の後読みを使用します。

$params = preg_split('/(?<!\\\\) /', $str);

上記の正規表現は、バックスラッシュが前にないすべてのスペースに一致します。これはまさに意図したとおりです。

実際に見てください

更新:以前の正規表現は、スペースの前の文字と一致するため(バックスラッシュでない限り)、文字を使い果たします。したがって、その文字は区切り文字の一部と見なされ、スペースとともに出力から削除されます。

後読みバージョンは、スペースの前にバックスラッシュがないことを主張しますが、文字とは一致しません。これは重要な違いです。

于 2012-06-15T11:43:12.590 に答える