2015-06-25 162 views
3

我試圖explode用逗號分隔的字符串:,但只有當它不是括號之間(...)爆炸字符串時不()之間

下面是一些代碼來說明我的意思:

$string = "K.VisueelNr,IFNULL(P.Partijnaam, 'Leeg gemeld') AS Partijnaam,R.Ras,M.Maat,DATE_FORMAT(KS.Timestamp, '%d-%c-%Y') AS Datum,H.Handelshuis,KS.Actie"; 

print_r(str_getcsv($string, '()')); 

print_r(explode(",", $string)); 

這將輸出:

Array 
(
    [0] => K.VisueelNr,IFNULL 
    [1] => P.Partijnaam, 'Leeg gemeld') AS Partijnaam,R.Ras,M.Maat,DATE_FORMAT 
    [2] => KS.Timestamp, '%d-%c-%Y') AS Datum,H.Handelshuis,KS.Actie 
) 
Array 
(
    [0] => K.VisueelNr 
    [1] => IFNULL(P.Partijnaam 
    [2] => 'Leeg gemeld') AS Partijnaam 
    [3] => R.Ras 
    [4] => M.Maat 
    [5] => DATE_FORMAT(KS.Timestamp 
    [6] => '%d-%c-%Y') AS Datum 
    [7] => H.Handelshuis 
    [8] => KS.Actie 
) 

但是我正在尋找像這樣的輸出:

Array 
(
    [0] => K.VisueelNr 
    [1] => IFNULL(P.Partijnaam, 'Leeg gemeld') AS Partijnaam 
    [2] => R.Ras 
    [3] => M.Maat 
    [4] => DATE_FORMAT(KS.Timestamp, '%d-%c-%Y') AS Datum 
    [5] => H.Handelshuis 
    [6] => KS.Actie 
) 

Here's an PHP Sandbox fiddle to play around

也許它必須與preg_split做,但我不知道該怎麼regex會是什麼樣子,然後...

回答

3

您需要使用preg_split根據其將輸入給定的正則表達式。

$words = preg_split('~,(?![^()]*\))~', $str); 
print_r($words); 

DEMO

說明:

  • ,所有的逗號,只有當它不
  • 後跟任意字符,但不是(),零次或多次
  • 匹配
  • ,接着是一個右括號。

如果您將(?!更改爲(?=,它會完全匹配括號內的所有逗號。

+1

非常感謝。其作品的確如預期的那樣。並非常感謝您的演示鏈接。由解釋提供的信息非常有用 – Mathlight

+0

@Mathlight請注意,這種方法非常脆弱。當嵌套的函數調用時它會中斷。 – nhahtdh

+0

@nhahtdh幸運的是,事實並非如此。但現在我很好奇。你能否指出我到了解釋這個問題的地方? – Mathlight