Как взорваться на каждой второй запятой в строке?

В каком-то старом коде я обнаружил ошибку, которую, надеюсь, я смогу исправить довольно быстро с помощью SO-сообщества.

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

 Norfolk, VA, Chicago, IL, New York, NY

Мне нужно сохранить внутреннюю запятую и использовать запятую в качестве разделителя.

Текущий код PHP получает данные следующим образом:

 $deliveryCityArray = explode(',', $_POST['deliveryCity']);

Когда отображается в сетке, город / штат должен быть в том же столбце.

К сожалению, с моим текущим кодом, город будет в своей собственной ячейке, а штат — в следующем ряду.

Что мне нужно добавить, чтобы оставить запятую, но оставить внутреннюю запятую?

1

Решение

Eсть шаблон в строке, которую вы пытаетесь обработать: вы хотите explode ввод на каждой запятой после 2 заглавных букв. В таком случае:

$array = preg_split('/(?<=, [A-Z]{2}),/', $str);

работает просто отлично (DEMO)

Как это устроено:

  • (?<=: Позитивный взгляд за утверждением. Шаблон будет соответствовать, только если ему предшествует определенный суб-шаблон
  • , [A-Z]{2}): Подшаблон: запятая, пробел и 2 символа в верхнем регистре (закрывающая скобка сигнализирует об окончании утверждения просмотра сзади)
  • ,: литеральный , (который сопоставляется, если просмотр позади успешен). Этот символ сопоставляется и используется для взрыва строки. Вид сзади — это совпадение с нулевой шириной, поэтому он не рассматривается как часть разделителя.

Если вся строка в верхнем регистре, шаблон должен иметь шанс немного, но не много (Обновленная демоверсия):

$array = preg_split('/(?<=,\s[A-Z]{2}\b),/', $upperStr);

Я просто добавил \b на задний план (метасимвол, соответствующий границе слова). Эта граница слова в любом случае необязательна, поскольку мы сопоставляем , [A-Z]{2}, тем не мение.

2

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

Взрывается как обычно, затем разбивает результирующий массив на пары, затем обходит пары и снова взрывает их

$deliveryCity = 'Norfolk, VA, Chicago, IL, New York, NY';

$deliveryCityArray = array_map(
function($value) {
return implode(',', $value);
},
array_chunk(
explode(',', $deliveryCity),
2
)
);

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

2

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

$results = array();
$tmp = explode(",",$_POST['deliveryCity']);
$idx = 0;
while ($idx < count($tmp)){
$results[] = $tmp[$idx] . "," . $tmp[$idx+1];
$idx += 2;
}

//$results will contain your resultant array.
2

При использовании регулярных выражений для лучшей эффективности избегайте использования групп захвата и обходных путей. Эта задача может быть выполнена без этих методов путем использования \K «перезапустить матч с полной строкой».

Код: (демонстрация)

$string='Norfolk, VA, Chicago, IL, New York, NY';
var_export(preg_split('/[A-Z]{2}\K, /',$string));

Выход:

array (
0 => 'Norfolk, VA',
1 => 'Chicago, IL',
2 => 'New York, NY',
)

Эта модель эффективно говорит:

  • Ищите сокращенные состояния (две заглавные буквы), затем
  • Затем перезапустите матч с полной строкой
  • Используйте запятую и пробел в качестве разделителя. Просто и чисто.
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector