Мне необходимо explode()
этот
«194», «??», «Точка, есть», «3», «0», «4», «35» ,, 0, «ЖИВОТНЫЕ», «СТУН, МЕДЛЕННО, КУРС, ТЕРРОР»
на отдельные элементы.
Содержимое элементов может быть заключено в кавычки или апостроф (но не может быть указано вообще).
Струны с нулевой шириной также должны совпадать.
Как видите, я не могу взорвать его запятой, потому что запятые включены в некоторые элементы.
Где-то между элементами отсутствуют пробелы, и пробелы могут быть включены в сам элемент.
Результат должен быть:
Элемент 0 = 194
Элемент 1 = ??
Элемент 2 = Точка, есть
Элемент 3 = 3
Элемент 4 = 0
Элемент 5 = 4
Элемент 6 = 35
Элемент 7 =
Элемент 8 = 0
Элемент 9 = ЖИВОТНОЕ
Элемент 10 = ОЖИДАНИЕ, МЕДЛЕННО, КУРС, ТЕРРОР
использование str_replace () преобразовать '
в "
; затем используйте str_getcsv ()
$str = "'194', '??','Dot, is', \"3\",\"0\", '4', '35',, 0, 'ANIMAL','STUN,SLOW,CURSE,TERROR'";
$array = str_getcsv(
str_replace("'", '"', $str)
);
var_dump($array);
Вот способ вызова / регулярного выражения 1 без групп захвата и без подготовки строки …
Код: (демонстрация) (Образец Демо)
// Using HEREDOC syntax to avoid escaping quotes in $string and $pattern
$string=<<<EOD
'194', '??','Dot, is', "3","0", '4', '35',, 0, 'ANIMAL','STUN,SLOW,CURSE,TERROR'
EOD;
$pattern=<<<EOD
/(?:^|,)(?: *(?:'\K[^']*|"\K[^"]*|\K[^,]+|\K(?=,)))/
EOD;
var_export(preg_match_all($pattern,$string,$out)?$out[0]:'fail');
Выход:
array (
0 => '194',
1 => '??',
2 => 'Dot, is',
3 => '3',
4 => '0',
5 => '4',
6 => '35',
7 => '',
8 => '0',
9 => 'ANIMAL',
10 => 'STUN,SLOW,CURSE,TERROR',
)
Существует 4 типа совпадений. Я перечислю их в порядке моих шаблонных альтернатив.
Замечания: \K
сбрасывает совпадение полной строки — это то, что разрешает пропуск групп захвата и позволяет выходному массиву размещать все совпадения в одном подмассиве [0]
,