2016-12-05 98 views
3

省略逗號我有一個字符串,說:正則表達式 - 如何用逗號分割的字符串,括號

$str = "myTemplate, testArr => [1868,1869,1870], testInteger => 3, testString => 'test, can contain a comma'"

它基本上代表了一個逗號分隔的我需要解析的參數列表。

我需要拆分的逗號PHP(可能使用preg_match_all)此字符串(但省略了那些括號和引號),所以最終的結果將是以下四場比賽的數組:

myTemplate 
testArr => [1868,1869,1870] 
testInteger => 3 
testString => 'test, can contain a comma' 

問題與數組和字符串值。因此[]或''或「」中的任何逗號都不應被視爲分隔符。

這裏有很多類似的問題,但我無法得到它在這種特殊情況下工作。什麼是正確的正則表達式來獲得這個結果?謝謝!

+1

你可以分享你的嘗試? –

+2

你可以分享嗎?你的數據看起來是什麼 – RiggsFolly

+0

@PavneetSingh你已經將一個已經模糊的描述變成了別的東西。 **編輯問題時需要注意** – RiggsFolly

回答

2

你可以使用這個環視基於正則表達式:

$str = "myTemplate, testArr => [1868,1869,1870], testInteger => 3, testString => 'test, can contain a comma'"; 

$arr = preg_split("/\s*,\s*(?![^][]*\])(?=(?:(?:[^']*'){2})*[^']*$)/", $str); 

print_r($arr); 

有在這個表達式中使用2個lookarounds:

  • (?![^][]*\]) - 斷言逗號是不是裏面[...]
  • (?=(?:(?:[^']*'){2})*[^']*$) - 斷言逗號不在裏面'...'

PS:這是假設我們沒有不平衡/嵌套/轉義的引號和括號。

RegEx Demo

輸出:

Array 
(
    [0] => myTemplate 
    [1] => testArr => [1868,1869,1870] 
    [2] => testInteger => 3 
    [3] => testString => 'test, can contain a comma' 
) 
1

我咬咬牙做這樣的:

<?php 

$str = "myTemplate, testArr => [1868,1869,1870], testInteger => 3, testString => 'test, can contain a comma'"; 


$pattern[0] = "[a-zA-Z]+,"; // textonly entry 
$pattern[1] = "\w+\s*?=>\s*\[.*\]\s*,?"; // array type entry with value enclosed in square brackets 
$pattern[2] = "\w+\s*?=>\s*\d+\s*,?"; // array type entry with decimal value 
$pattern[3] = "\w+\s*?=>\s*\'.*\'\s*,?"; // array type entry with string value 

$regex = implode('|', $pattern); 

preg_match_all("/$regex/", $str, $matches); 

// You can also use the one liner commented below if you dont like to use the array 
//preg_match_all("/[a-zA-Z]+,|\w+\s*?=>\s*\[.*\]\s*,?|\w+\s*?=>\s*\d+\s*,?|\w+\s*?=>\s*\'.*\'\s*,?/", $str, $matches); 
print_r($matches); 

這是易於管理,我可以輕鬆地添加/如果需要刪除模式。它會輸出像

Array 
(
[0] => Array 
    (
     [0] => myTemplate, 
     [1] => testArr => [1868,1869,1870], 
     [2] => testInteger => 3, 
     [3] => testString => 'test, can contain a comma' 
    ) 

) 
+0

看起來不錯,謝謝! – Tomage

相關問題