str replace — странная ошибка с пробелами в переполнении стека

У меня есть номера телефонов, которые я хочу отформатировать

И у меня есть шаблон сопоставления, который разбивает числа в 10-значный формат, а затем применяет тире.
Это работает большую часть времени. Однако у меня возникли проблемы с определенными номерами.

$trimmed = trim(preg_replace('/\s+/', '', $v->cust_num));
$tendigit = str_replace(array( '(', ')','-',' ' ), '', $trimmed);
$num = substr($tendigit,0,3)."-".substr($tendigit,3,3)."-".substr($tendigit,6,4);

Это изменит (555) 555 5555 или 555-555 5555 или 5555555555 или (555) -555-5555 или 555-555-5555
в мой формат 555-555-5555

Тем не менее, я наткнулся на несколько записей в моей базе данных, которые, похоже, не хотят меняться.

Это одна из плохих записей. Он содержит два пробела перед 4.

   4-035-0100

Когда он проходит через $ trimmed, и я вывожу $ tendigit … он выводит

  40350100

как и ожидалось. Но потом, когда я применяю $ num к нему. Это восходит к

 4-035-0100

Я бы по крайней мере ожидал, что это будет

 403-501-00

Кажется, в нем есть какие-то скрытые пробелы, что мои preg_replace, trim и str_replace не атакуют.

Есть идеи??

Спасибо

0

Решение

Приведенный ниже код работает, я пробовал его с помощью специальных символов, которые мы обнаружили в комментариях. По сути, регулярное выражение удаляет все, что не является числом (0-9), а затем использует исходное форматирование.

$trimmed = preg_replace('/\D+/', '', $v->cust_num);
$num = substr($trimmed,0,3)."-".substr($trimmed,3,3)."-".substr($trimmed,6,4);
0

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

Вы можете немного сжать свой код:

$tendigit = preg_replace('/[^\d]/', '', $v->cust_num);
$num = substr($tendigit,0,3)."-".substr($tendigit,3,3)."-".substr($tendigit,6,4);

Тем не менее, вы должны добавить некоторые условия, чтобы проверить, что номер телефона на самом деле тоже имеет 10 цифр:

$tendigit = preg_replace('/[^\d]/', '', $v->cust_num);
if(strlen($tendigit == 10)){
$num = substr($tendigit,0,3)."-".substr($tendigit,3,3)."-".substr($tendigit,6,4);
} else {
// catch your error here, eg 'please enter 10 digits'
}

Первая строка удаляет все «не цифры» [^ \ d].

Условный оператор проверяет, содержит ли переменная $ tendigit 10 цифр.

Если это так, то он использует ваш код для анализа и форматирования.

Если это не так, то вы можете поймать ошибку.

0

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