2013-06-13 68 views
1

我需要PHP中正則表達式的幫助。 我有一個字符串包含大量的數據,格式可能是這樣的。PHP需要的正則表達式preg_split

key=value,e4354ahj\,=awet3,asdfa\=asdfa=23f23

所以我有2個分隔符,和=其中,是一組鍵和值。事情是,鍵和值可以包含相同的符號,和=但他們將永遠逃脫。所以我不能使用爆炸。我需要使用preg_split,但我不擅長正則表達式。

有人能幫我一個這個嗎?

回答

4

您需要使用negative lookbehind

// 4 backslashes because they are in a PHP string, so PHP translates them to \\ 
// and then the regex engine translates the \\ to a literal \ 
$keyValuePairs = preg_split('/(?<!\\\\),/', $input); 

這會分裂每個,未逃脫,讓你獲得鍵值對。您可以爲每一對來分隔鍵和值做同樣的:

list($key, $value) = preg_split('/(?<!\\\\)=/', $pair); 

See it in action

+1

偉大的答案喬恩。奇蹟般有效。謝謝 –

1

@ Jon的回答非常棒。不過,我覺得通過字符串匹配型提供了一個解決方案:

preg_match_all('#(.*?)(?<!\\\\)=(.*?)(?:(?<!\\\\),|$)#', $string, $m); 
// You'll find the keys in $m[1] and the values in $m[2] 
$array = array_combine($m[1], $m[2]); 
print_r($array); 

輸出:

Array 
(
    [key] => value 
    [e4354ahj\,] => awet3 
    [asdfa\=asdfa] => 23f23 
) 

說明:

  • (.*?)(?<!\\\\)=匹配任何條件和組,直到=不前通過\
  • (.*?)(?:(?<!\\\\),|$):匹配任何內容並將其分組,直到,之前沒有\或行尾。
+1

這工作正常,方便,很好的觸摸。唯一的缺點是像這樣的代碼必須伴隨大量的評論。 – Jon

+0

@Jon我正在寫'preg_split'解決方案,但您的速度更快:-) – HamZa