Как мне разбить строку по ,
но пропустить тот, который находится внутри массива
строка — «==», [‘abc’, ‘xyz’], 1 «
Когда я делаю explode(',', $expression)
это дает мне 4 элемента в массиве
array:4 [
0 => "'=='"1 => "['abc'"2 => "'xyz']"3 => 1
]
Но я хочу, чтобы мой результат был —
array:3 [
0 => "'=='"1 => "['abc', 'xyz']"2 => 1
]
да, регулярное выражение — выберите все запятые, игнорируйте в квадратных скобках
/[,]+(?![^\[]*\])/g
В качестве примера вы можете использовать данные preg_split и используйте регулярное выражение для сопоставления запятой или совпадения части с квадратными скобками, а затем пропустите это с помощью (* SKIP) (* СБОЙ).
$pattern = '/,|\[[^]]+\](*SKIP)(*FAIL)/';
$string = "'==', ['abc', 'xyz'], 1";
$result = preg_split($pattern, $string);
print_r($result);
Это даст вам:
Array
(
[0] => '=='
[1] => ['abc', 'xyz']
[2] => 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
)