2009-08-10 8 views
0

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

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

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

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

Спасибо!

ответ

4

Это нетривиальная проблема, потому что существует множество коллоквиализмов и региональных различий. Пожалуйста, обратитесь к What is the best way for converting phone numbers into international format (E.164) using Java? Это Java, но применяются те же правила.

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

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

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

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

+0

Красиво объяснено. +1 – Boldewyn

+0

Ваш пример кода работал очень хорошо, но мне очень трудно было его понять. Я написал: $ phone = preg_replace ('/ [^ \ d] /', '', $ phone); . Есть ли разница между этими двумя? Где я могу больше узнать о восклицательных знаках, которые вы используете? –

+0

Единственное различие заключается в том, что я заменяю группу без цифр пустой строкой (следовательно, оператор +, чтобы указать один или несколько), а не одну цифру с пустой строкой. Очень незначительная разница. – cletus

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

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

или вы могли бы использовать preg_replace

$number = preg_replace('/[^0-9]/', '', $number); 
0

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

0

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

Смежные вопросы