laravel — PHP: разбить строку запятыми (,), но игнорировать что-либо в квадратных скобках?

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

строка — «==», [‘abc’, ‘xyz’], 1 «

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

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

Но я хочу, чтобы мой результат был —

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

2

Решение

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

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

https://regexr.com/3qudi

5

Другие решения

В качестве примера вы можете использовать данные preg_split и используйте регулярное выражение для сопоставления запятой или совпадения части с квадратными скобками, а затем пропустите это с помощью (* SKIP) (* СБОЙ).

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

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

Это даст вам:

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

демонстрация

1

Например, если вы не хотите использовать регулярные выражения и хотите придерживаться 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
По вопросам рекламы [email protected]