Задать вопрос
ddimonn8080
@ddimonn8080

Правильно ли составлено регулярное выражение на PHP?

Здравствуйте. Нужно проверить правильность заполнения поля формы с номером телефона.
Составил регулярное выражение. Делаю это впервые. Подскажите правильно ли составлено оно:
if(!preg_match("/[+][3][8][0][(][0-9]{2}[)][0-9]{3}[-][0-9]{2}[-][0-9]{2}$/i",$phone)) {
		$errorPhone .= "Введите корректный номер телефона<br>";
	}

Сам номер телефона - должна быть маска +380(__)___-__-__ только числа, длина до 20 символов.
  • Вопрос задан
  • 131 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 4
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
  • Делать символьные классы из одного символа совершенно излишне. С другой стороны, тогда вам придётся экранировать специальные символы (скобки, плюс). Такая запись (с экранированием) более привычна тем, кто знаком с регулярками, но может быть сложнее для новичков. Однако, я всё же рекомендую привыкать к обратным слэшам - скоро вы перестанете их замечать.
  • Символьный класс [0-9] можно заменить на сокращение \d. На мой взгляд, так выглядит чище.
  • Если уж ставите ограничение на конец строки ($), то и начало (^) стоит поставить.
  • Учитывая, что у вас в строке вообще нет букв, ни к чему добавлять модификатор i

Результат:
/^\+380\(\d{2}\)\d{3}-\d{2}-\d{2}$/
Ответ написан
Комментировать
xpert13
@xpert13
Full Stack Developer
https://regex101.com/r/lCsKL2/1

Основная ваша ошибка - не экранированные символы "+", "(" и ")". Ну и каждый отдельный символ брать в квадратные кавычки не обязательно. Вместо "[0-9]" можно использовать "\d"
Ответ написан
impwx
@impwx
Разработчик
Не нужно оборачивать одиночные символы в квадратные скобки. Можно писать их просто так. Для символов со специальным значением (плюс и скобки) нужно использовать экранирование обратным слэшем. Чтобы не плодить по два слэша, используйте строку с одинарными кавычками. Тире, если не внутри квадратных скобок, спецсимволом не является и экранировать его не нужно.

Итого:

preg_match('/^\+380\([0-9]{2}\)[0-9]{3}-[0-9]{2}-[0-9]{2}$/i', $phone)

Если в каком-то месте могут быть пробелы, можно добавить туда \s*. Если пробелы могут быть где угодно, проще сначала заменить пробел на пустую строку по всему значению.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Ваша регулярка рабочая, но нагромождена излишеством. Можно проще:

if(!preg_match("/+380\(\d{2})\d{3}-\d{2}-\d{2}$/i",$phone)) {
    $errorPhone .= "Введите корректный номер телефона<br>";
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы