Регулярные выражения: исключить буквы и оставить некоторые символы PHP

188
10 февраля 2019, 14:40

Помогите составить регулярное выражение, которое проверяет строку на то, чтобы в ней были только цифры(от 7 до 15), но также среди цифр могли бы быть символы "-", "(", ")", " "(пробел). Причем пробелов и символов "-" было не больше 5, а каждой из скобочек не больше 1. Например 053654895665, или 96(8) 956-17-26

Answer 1

Например 053654895665, или 96(8) 956-17-26

Для вашего примера подойдёт такой вариант:

$str = 'Например 053654895665, или 96(8) 956-17-26';
preg_match_all('~\b(?:\d{7,15}|\d{2}\(\d\)\s?\d{3}(?:-\d{2}){2})\b~', $str, $arr);
var_dump($arr);

UPD: Вариант с учётом списка номеров:

$str = '+375296398545
+375(29)6398545
375296398545
375-29-639-85-45
+375-29-639-85-45
+375(29)639-85-45
375(29)639-85-45
375(29)639 85 45
+375 29 639 85 45
375 29 6398545';
$patt = '~
    \b \+? (?:
        # +375296398545 или 375296398545
        \d{7,15}     |
        # +375(29)6398545
        \d{3}  \( \d{2} \)  \d{7}     |
        # 375-29-639-85-45
        (?:  \d{3}- \d{2}-  ){2}  \d{2}     |
        # +375(29)639-85-45 и все остальные
        \d{3}  [\h(] \d{2} [\h)]  \d{3}  (?:  [\h-]? \d{2}  ){2}
    )\b
~x';
preg_match_all($patt, $str, $arr);
print_r($arr);

Результат (все номера из списка):

Array
(
    [0] => Array
        (
            [0] => 375296398545
            [1] => 375(29)6398545
            [2] => 375296398545
            [3] => 375-29-639-85-45
            [4] => 375-29-639-85-45
            [5] => 375(29)639-85-45
            [6] => 375(29)639-85-45
            [7] => 375(29)639 85 45
            [8] => 375 29 639 85 45
            [9] => 375 29 6398545
        )
)

P.S.: Всё не предусмотреть.

Answer 2

Валидация телефона это дно, так как в Америке и других странах могут быть телефоны с буквами, это сравнимо с валидацией имени и фамилии. Не понимаю почему заказчики думают, что человек не в состоянии написать свои ФИО, это абсурд.

Ну, как алгоритм, могу предложить следующее:

// удалим разрешенные символы из строки
$phoneCheck = str_replace(['+', ' ', ')', '(', '-'], '', $phone);
// далее приводим к integer
$phoneCheckSumm = (int) $phoneCheck;
// сравниваем две переменные 
if($phoneCheck == $phoneCheckSumm && $phoneCheck >= 7 && $phoneCheck <= 15) {
   echo 'все верно';
} else {
   echo 'что то не так';
}

Логика проста, если при проведение к типу integer php отсечет буквы, либо символы, то переменные не будут равны. В общем лучше не валидировать такие вещи, ибо это создаст больше неудобства чем пользы для пользователя

p.s. 15 это не цифра, а число, так что задача неверна.

READ ALSO
Opencart, разные валюты в админке и фронте

Opencart, разные валюты в админке и фронте

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

177
Форма Заказа в com_zoo (joomla)

Форма Заказа в com_zoo (joomla)

Может кто-то подсказать как перехватить данные с формы, которая находиться в корзине, для оформления заказаКомпонент для каталога и корзины...

160
Оптимизация изображений для сайта - php Imagick

Оптимизация изображений для сайта - php Imagick

Нужно оптимизировать изображения так чтобы проходить проверку Gtmetrix или Google PageSpeed Insights (результат у них одинаковый), для этого использую php расширение...

196