2016-08-28 104 views
0

我有這個文件code.php它在命令行上作爲交互式應用程序工作。代碼的一部分是這樣的命令行輸入到PHP陣列

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

現在我想將此輸入字符串轉換爲參數數組。我正在對空格字符進行定義。例如:

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

它適用於大多數的情況下,但我想地方插入字符串具有空間本身更多的情況。例如:

$input // "a var" and a 123 

此代碼應該分成四個元素而不是五個數組。我相信它可以用正則表達。但是在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,另外。


線索是匹配雙引號之間的所有內容,然後強制引擎拋出匹配。然後 |之後的交替成功匹配。顯然,這可以擴展爲單引號和大括號。

甚至允許 轉義引號,你可以調整lookarounds表達:

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

PHP,你需要逃避這些爲好,所以代碼變成:

<?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