我使用preg_split方法存在問題。我想用逗號分割,但前提是逗號不在(和)之間。以逗號分隔哪裏不在(和)
例如:
id,user(id,firstname),image(id)
應返回:
0 => id
1 => user(id,firstname)
2 => image(id)
我使用preg_split方法存在問題。我想用逗號分割,但前提是逗號不在(和)之間。以逗號分隔哪裏不在(和)
例如:
id,user(id,firstname),image(id)
應返回:
0 => id
1 => user(id,firstname)
2 => image(id)
我已使用preg_split
和PREG_SPLIT_DELIM_CAPTURE
解決了此問題。
$tokens = preg_split('#(\,|\(|\))#', 'id,user(id,firstname),image(id)', PREG_SPLIT_DELIM_CAPTURE);
返回:
["id", ",", "user", "(", "id", "firstname", ")", "image", "(", "id", ")"]
之後,你可以用解析簡單的開關情況下陣列。
你可能想嘗試一個分析器發電機,而不是一個正則表達式。我不熟悉PHP中的替代方法,但this answer表示一些替代方案。
我會建議試着找到一個解析器,但它可以使用正則表達式來完成。
使用下面的正則表達式:/\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g
更多細節在這裏:http://regex101.com/r/nA7dW5
好運
快速性和可讀性的解決辦法是這樣的:
<?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)'));
它絕對可以用一個單一的正則表達式來完成,但是可讀性將受到嚴重傷害。
好主意。 Mikulas ;-) – MrBoolean
你應該有機箱,數據的來源是什麼?錯誤的CSV形式在猜測 – 2012-09-24 21:49:19
你應該'_match'ing,而不是分裂。 – mario
可能重複的[在PHP中用逗號分解複雜字符串](http://stackoverflow.com/questions/11062241/explode-complex-string-by-commas-in-php)(剛選擇第一個谷歌鏈接,有其他...) – mario