2016-08-28 2 views
0

私はこのファイルを持っていますcode.phpこれはコマンドラインで対話型アプリケーションとして動作します。コードの部分は次のようになりますPHP配列へのコマンドライン入力

$f = fopen('php://stdin','w'); 
$input = fgets($f); 

ここでは、この入力文字列を引数の配列に変換します。私はの空白文字に引数を区切ります。例えば:

$arguments = explode(' ', $input); 

それはほとんどの場合のために正常に動作しますが、私は、文字列自体にスペースを持っているもう一つのケースを挿入したいです。

$input // "a var" and a 123 

このコードは、5つではなく4つの要素の配列に分割する必要があります。私は正規表現で可能と信じています。しかし、他にPHPでもっと簡単で高速なオプションがあります。

ほとんどの場合、の正規表現で最適化してください。

答えて

1

は簡単(*SKIP)(*FAIL)で行うことができます:

<?php 

$string = 'argument1 argument2 "argument3 with spaces" argument4'; 
$regex = '~"[^"]*"(*SKIP)(*FAIL)|\ ~'; 

$arguments = preg_split($regex, $string); 
print_r($arguments); 
?> 

はさらに、a demo on ideone.coma demo on regex101.comを参照してください。


ヒントは、二重引用符の間のすべてを一致させてから、エンジンに強制的に一致させることです。その後、 |の後の交替は正常にマッチングされます。明らかに、これは単一引用符と中括弧に対しても拡張できます。 PHP

(?<!\\)".*?(?<!\\)"(*SKIP)(*FAIL)|\ 

、あなたにもこれらをエスケープする必要があり、そのコードは次のようになります:

<?php 

$string = 'argument1 argument2 "argument3 with spaces" argument4 "argument5 with \"escaped quotes\""'; 
$regex = '~(?<!\\\\)".*?(?<!\\\\)"(*SKIP)(*FAIL)|\ ~'; 

$arguments = preg_split($regex, $string); 
print_r($arguments); 
?> 
+0

おかげでさえは、あなたが前後参照を持つ式を調整することができます引用符をエスケープできるようにするには


助けのために、それは私の問題で動作します。 ** \ "** – anwerj

+0

と引用符をエスケープすることはできますか?@anwerjunaid:すべての要件を投稿してください:)エスケープされた引用符でも動作するように式を調整することができます。 – Jan