Разбить строку на элементы

Мне необходимо explode() этот

«194», «??», «Точка, есть», «3», «0», «4», «35» ,, 0, «ЖИВОТНЫЕ», «СТУН, МЕДЛЕННО, КУРС, ТЕРРОР»

на отдельные элементы.

Содержимое элементов может быть заключено в кавычки или апостроф (но не может быть указано вообще).

Струны с нулевой шириной также должны совпадать.

Как видите, я не могу взорвать его запятой, потому что запятые включены в некоторые элементы.

Где-то между элементами отсутствуют пробелы, и пробелы могут быть включены в сам элемент.

Результат должен быть:

Элемент 0 = 194
Элемент 1 = ??
Элемент 2 = Точка, есть
Элемент 3 = 3
Элемент 4 = 0
Элемент 5 = 4
Элемент 6 = 35
Элемент 7 =
Элемент 8 = 0
Элемент 9 = ЖИВОТНОЕ
Элемент 10 = ОЖИДАНИЕ, МЕДЛЕННО, КУРС, ТЕРРОР

1

Решение

использование 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);
3

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

Вот способ вызова / регулярного выражения 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],

0

По вопросам рекламы [email protected]