PHP Разбить значения, разделенные запятыми, с датой

Я использую взорваться для анализа строки значений, разделенных запятыми, в переменные. Нет проблем. Проблема, с которой я сталкиваюсь, заключается в том, что одно из значений является датой в формате: 3 мая 2013 года. Таким образом, взрыв начинается с запятой в дате. Есть ли у меня варианты обойти это? У меня нет большого контроля над источником (исходной строкой), поэтому я пытаюсь найти способ работать с тем, что у меня есть.

$CONTENT = 'blue,red,purple,May 2, 2013,orange,green';
list($valueA, $valueB, $valueC, $valueD, $valueE, $valueF) = explode(',', $CONTENT);

Благодарю вас!


person Jason    schedule 02.05.2013    source источник
comment
правильно ли указана переменная $CONTENT? Я думаю, вы имели в виду $CONTENT="blue,red,purple...", верно?   -  person MatthiasLaug    schedule 02.05.2013
comment
используйте str_getcsv() - php.net/manual/en/function.str -getcsv.php   -  person Mark Baker    schedule 02.05.2013
comment
@MatthiasLaug Да, извините за это. Исправлено!   -  person Jason    schedule 02.05.2013
comment
исходный контент всегда так формируется?   -  person Willy Pt    schedule 02.05.2013
comment
Я считаю, что вы ничего не можете сделать, если он сформирован таким образом, если только вы не можете найти обходной путь, чтобы изменить разделитель на что-то другое, кроме ',' в скрипте, который генерирует $CONTENT   -  person Willy Pt    schedule 02.05.2013
comment
Исправьте все, что генерирует строку в первую очередь. Это окупится лучше, чем попытка исправить сломанный вывод.   -  person Marc B    schedule 02.05.2013


Ответы (3)


Вы можете использовать регулярное выражение для разделения строки. Это основано на предположении, что между двумя словами нет пробела, если оно используется в качестве разделителя.

$CONTENT = 'blue,red,purple,May 2, 2013,orange,green';
$result = preg_split('/,(?! )/', $CONTENT);

ваша строка приведет к правильному результату

array(6) {
   [0]=>
      string(4) "blue"
   [1]=>
      string(3) "red"
   [2]=>
      string(6) "purple"
   [3]=>
      string(11) "May 2, 2013"
   [4]=>
      string(6) "orange"
   [5]=>
     string(5) "green"
}

поэтому, как только вы снова используете свое выражение списка, ваши переменные должны быть установлены правильно

list($valueA, $valueB, $valueC, $valueD, $valueE, $valueF) = preg_split('/,(?! )/', $CONTENT);
person MatthiasLaug    schedule 02.05.2013

Избегайте запятой, найдя значение в массиве и заменив запятую специальным символом, а затем после взрыва замените специальный символ запятой.

person Jared    schedule 02.05.2013
comment
Но как отличить запятую внутри даты от запятой, разделяющей два элемента списка? - person andrewsi; 02.05.2013
comment
О, я не прочитал ваш вопрос должным образом. Может быть, использовать регулярное выражение, чтобы попытаться найти любые допустимые даты (месяц, день, год), а затем вынуть их, взорвать, вернуть обратно? - person Jared; 03.05.2013

Единственное, что я могу придумать, это использовать регулярное выражение для поиска чего-то, соответствующего шаблону даты, заменить запятую чем-то другим, а затем, после того, как вы взорвете строку, снова замените этот специальный символ запятой.

Это грязно, но если вы действительно не контролируете входящую строку, вы, вероятно, мало что можете сделать.

person Mike    schedule 02.05.2013
comment
Вот регулярное выражение, соответствующее дате: \w{3,10}\s\d{1,2},\s\d{4} - person Chad; 02.05.2013
comment
Если предположить, что он останется в этом формате, что может быть, но кто знает, на самом деле. Но да, это сработает для данного примера, спасибо за это. - person Mike; 02.05.2013
comment
Без проблем. К сожалению, нам всем приходится делать много предположений, отвечая на ограниченный подмножество данных :-) - person Chad; 02.05.2013
comment
Спасибо всем. Очень ценю помощь. Я собираюсь вернуться и посмотреть, можно ли отформатировать строку содержимого по-другому, чтобы обеспечить некоторый уровень предсказуемости. Похоже, это единственный верный способ. - person Jason; 02.05.2013
comment
Если вы можете получить его, посмотрите, можете ли вы просто заставить их отправить его в формате csv со значениями в кавычках. что-то вроде "value one","red","May 1, 2013" Есть много разных вещей для разбора CSV, и даже если вы сделаете это сами, должно быть немного проще. - person Mike; 02.05.2013