Белый список в php

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

Я подумал, что могу сделать str_replace() для пробелов и специальных символов. Однако я думаю, что лучшим подходом было бы выбрать только цифры, а не удалять все остальное. Я думаю, что слышал термин «белый список» по этому поводу.

Не могли бы вы указать мне направление решения этого в PHP?

Пример: я хочу, чтобы ввод "0333 452-123-4" привел к "03334521234"

Спасибо!


person Felix Andersen    schedule 10.08.2009    source источник


Ответы (4)


Это нетривиальная проблема, потому что есть много разговорных выражений и региональных различий. Пожалуйста, обратитесь к Что лучший способ преобразования телефонных номеров в международный формат (E.164) с помощью Java? Это Java, но применяются те же правила.

Я бы сказал, что если вам не нужно что-то более полнофункциональное, сделайте это простым. Создайте список допустимых регулярных выражений и сравните ввод с каждым, пока не найдете совпадение.

Если вы хотите, чтобы это было очень просто, просто удалите нецифры:

$phone = preg_replace('![^\d]+!', '', $phone);

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

person cletus    schedule 10.08.2009
comment
Ваш пример кода работал очень хорошо, но мне было очень трудно его понять. Я написал: $phone = preg_replace('/[^\d]/', '', $phone); вместо. Есть ли разница между этими двумя? Где я могу узнать больше о восклицательных знаках, которые вы используете? - person Felix Andersen; 11.08.2009
comment
Единственное отличие состоит в том, что я заменяю группу нецифр пустой строкой (отсюда и оператор + для указания одной или нескольких), а не одну нецифру пустой строкой. Очень незначительная разница на самом деле. - person cletus; 11.08.2009

$number = filter_var(str_replace(array("+","-"), '', $number), FILTER_SANITIZE_NUMBER_INT);

Filter_Var удаляет все, кроме плюсов и минусов, а str_replace избавляется от них.

или вы можете использовать preg_replace

$number = preg_replace('/[^0-9]/', '', $number);
person Tyler Carter    schedule 10.08.2009

Вы можете сделать это двумя способами. Переберите каждый индекс в строке и запустите для него is_numeric(), или вы можете использовать регулярное выражение для строки.

person helloandre    schedule 10.08.2009

На стороне клиента я рекомендую использовать некоторое форматирование, которое вы разрабатываете при создании формы. Это хорошо для полей почтового индекса или телефона. Взгляните на этот jquery плагин для справки. Это будет намного проще позже на стороне сервера.

person Elzo Valugi    schedule 10.08.2009