PHP: разделить строку запятыми (,), но игнорировать что-либо в квадратных скобках? - PullRequest
0 голосов
/ 12 июня 2018

Как мне разбить строку на ,, но пропустить ту, которая находится внутри массива

String - "'==', ['abc', 'xyz'], 1 "

Когда я делаю explode(',', $expression), это дает мне 4 элемента в массиве

array:4 [
   0 => "'=='"
   1 => "['abc'"
   2 => "'xyz']"
   3 => 1
]

Но я хочу, чтобы мой вывод был -

array:3 [
   0 => "'=='"
   1 => "['abc', 'xyz']"
   2 => 1
]

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Да, регулярное выражение - выберите все запятые, игнорируйте в квадратных скобках

/[,]+(?![^\[]*\])/g

https://regexr.com/3qudi

0 голосов
/ 12 июня 2018

Например, если вы не хотите использовать регулярное выражение и хотите использовать функцию explode(), которую вы уже используете, вы можете просто заменить все экземпляры ', ' на ',', а затем разбить строкупо частям , (за которым следует пробел), а не просто запятая.

Таким образом, вещи в скобках не имеют разделителя разнесения, поэтому они не разбиваются на массивы.

Это создает дополнительную проблему: если бы у вас была строка типа '==', 'test-taco', это решение не сработало бы.Эта проблема, наряду со многими другими проблемами, вероятно, может быть решена путем удаления одинарных кавычек из отдельных строк, так как ==, test-taco все равно будет работать.

Это решение должно работать, если ваши строки в скобках являются действительными массивами PHP/ JSON строка

$str = "'==', ['abc', 'xyz'], 1";
$str = str_replace("', '", "','", $str);
$str = explode(", ", $str);

Хотя я рекомендую регулярное выражение, поскольку оно может решить некоторые основные проблемы, которые я не вижу.

Вывод:

Array
(
    [0] => '=='
    [1] => ['abc','xyz']
    [2] => 1
)
0 голосов
/ 12 июня 2018

Для данных вашего примера вы можете использовать preg_split и использовать регулярное выражение для сопоставления запятой или совпадения детали с квадратными скобками, а затем пропустить это с помощью (* SKIP) (* FAIL) .

,|\[[^]]+\](*SKIP)(*FAIL)

$pattern = '/,|\[[^]]+\](*SKIP)(*FAIL)/';
$string = "'==', ['abc', 'xyz'], 1";
$result = preg_split($pattern, $string);
print_r($result);

Это даст вам:

Array
(
    [0] => '=='
    [1] =>  ['abc', 'xyz']
    [2] =>  1
)

Демо

...