В каком-то старом коде я обнаружил ошибку, которую, надеюсь, я смогу исправить довольно быстро с помощью SO-сообщества.
Пользователь может вставить несколько городов / штатов в массив, поэтому массив будет выглядеть примерно так:
Norfolk, VA, Chicago, IL, New York, NY
Мне нужно сохранить внутреннюю запятую и использовать запятую в качестве разделителя.
Текущий код PHP получает данные следующим образом:
$deliveryCityArray = explode(',', $_POST['deliveryCity']);
Когда отображается в сетке, город / штат должен быть в том же столбце.
К сожалению, с моим текущим кодом, город будет в своей собственной ячейке, а штат — в следующем ряду.
Что мне нужно добавить, чтобы оставить запятую, но оставить внутреннюю запятую?
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},
тем не мение.
Взрывается как обычно, затем разбивает результирующий массив на пары, затем обходит пары и снова взрывает их
$deliveryCity = 'Norfolk, VA, Chicago, IL, New York, NY';
$deliveryCityArray = array_map(
function($value) {
return implode(',', $value);
},
array_chunk(
explode(',', $deliveryCity),
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.
При использовании регулярных выражений для лучшей эффективности избегайте использования групп захвата и обходных путей. Эта задача может быть выполнена без этих методов путем использования \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',
)
Эта модель эффективно говорит: