2012-09-24 34 views
2

我使用preg_split方法存在問題。我想用逗號分割,但前提是逗號不在)之間以逗號分隔哪裏不在(和)

例如:

id,user(id,firstname),image(id) 

應返回:

0 => id 
1 => user(id,firstname) 
2 => image(id) 
+0

你應該有機箱,數據的來源是什麼?錯誤的CSV形式在猜測 – 2012-09-24 21:49:19

+4

你應該'_match'ing,而不是分裂。 – mario

+1

可能重複的[在PHP中用逗號分解複雜字符串](http://stackoverflow.com/questions/11062241/explode-complex-string-by-commas-in-php)(剛選擇第一個谷歌鏈接,有其他...) – mario

回答

0

我已使用preg_splitPREG_SPLIT_DELIM_CAPTURE解決了此問題。

$tokens = preg_split('#(\,|\(|\))#', 'id,user(id,firstname),image(id)', PREG_SPLIT_DELIM_CAPTURE); 

返回:

["id", ",", "user", "(", "id", "firstname", ")", "image", "(", "id", ")"] 

之後,你可以用解析簡單的開關情況下陣列。

0

你可能想嘗試一個分析器發電機,而不是一個正則表達式。我不熟悉PHP中的替代方法,但this answer表示一些替代方案。

0

我會建議試着找到一個解析器,但它可以使用正則表達式來完成。

使用下面的正則表達式:/\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g

更多細節在這裏:http://regex101.com/r/nA7dW5

好運

-1

正則表達式/(\([^()]+\))|([^,]+)/會匹配一切,除了括號外的逗號。它有幫助嗎?

+0

你可以在這裏測試我的正則表達式:http://regexpal.com/ :) –

+1

不,你不能,因爲這是爲JavaScript。不是PHP;它是一種不同的正則表達式,並不是每件事都是一樣的。改用http://www.spaweditor.com/scripts/regex/index.php。 – Daedalus

+0

而現在,上述正則表達式並不符合OP的要求。 – Daedalus

2

快速性和可讀性的解決辦法是這樣的:

<?php 
function parse($str) { 
    $str = preg_replace('~(\(.*?),(.*?\))~', '$1_#_PLACEHOLDER_#_$2', $str); 

    $items = array(); 
    foreach (explode(',', $str) as $item) { 
     $items[] = str_replace('_#_PLACEHOLDER_#_', ',', $item); 
    }; 
    return $items; 
} 

var_dump(parse('id,user(id,firstname),image(id)')); 

它絕對可以用一個單一的正則表達式來完成,但是可讀性將受到嚴重傷害。

+0

好主意。 Mikulas ;-) – MrBoolean