PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


PHP Формы — Проверка имени, E-mail и URL




В данной статье, мы рассмотрим возможности PHP проверить, корректно ли в форме указан адрес электронной почты (email), имя пользователя и URL-адрес.


В приведенном ниже коде показан простой способ проверки валидности введённого пользователем имени. Согласно регулярке в поле name можно вводить только латинские буквы, дефисы, апострофы и пробелы. Если значение поля имени не соответствует шаблону, то в переменную $nameErr сохраним сообщение об ошибке:

<?php
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
  $nameErr = "Введите корректное имя";
}
?>

Примечание: Функция preg_match() ищет в строке $name шаблон, возвращая true, если шаблон существует, и false, если данные в строке не соответсвуют шаблону.

Но что если нужно, чтобы имя было ТОЛЬКО на латинице или ТОЛЬКО на кирилице и ограничить длину до 30 символов? Например, для полных имён типа "Максим Максимов-Суханов" или "Maxim Maximov-Sukhanov", естественно только на одном из языков регулярное выражение примет следующий вид (бонусом можно писать украинские имена):

<?php
$name = test_input($_POST["name"]);
if (!preg_match("/^(([a-zA-Z' -]{1,30})|([а-яА-ЯЁёІіЇїҐґЄє' -]{1,30}))$/u",$name)) {
  $nameErr = "Введите корректное имя";
}
?>

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

/^([А-ЯЁ]{1}[а-яё]{29})|([A-Z]{1}[a-z]{29})$/u

Примечание: Не забывайте про букву "Ё", которая не входит в диапазон "А-Я" и её нужно указывать отдельно!

Как известно email состоит из двух основных частей — username@hostname. Локальная часть email-адреса — это то, что перед знаком "@"(ASCII-код 64), а часть после знака — это домен получателя. Локальная часть может иметь длину до 64 символов, а имя домена может содержать не более 253 символов.

Локальная часть может включать прописные и строчные латинские буквы (A – Z, a – z) (ASCII: 65–90, 97–122), цифры от 0 до 9 (ASCII: 48–57), специальные символы: # - _ ~! $ & '() * +,; =: и %20, точка(.), ASCII 46, при условии, что она не является первым или последним символом, а также при условии, что она не идет последовательно (например, Max..Fax@example.com не допускается).

Доменная часть email-адреса должна соответствовать строгим правилам — соответствовать требованиям к имени хоста, состоящему из букв, цифр, дефисов и точек. Кроме того, доменная часть может быть литералом IP-адреса, который заключается в квадратные скобки [], но это редко встречается.

Реализуем проверку email разложив её на сосотавляющие, алгоритм которых следует предписаниям стандарта RFC 2822:

<?php
$email = test_input($_POST["email"]);
$user = '[a-zA-Z0-9_\-\.\+\^!#\$%&*+\/\=\?`\|\{\}~\']+'; // локальная часть
$domain = '(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.?)+'; // домен
$ipv4 = '[0-9]{1,3}(\.[0-9]{1,3}){3}'; // ip-адрес по протоколу ipv4
$ipv6 = '[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7}'; // ip-адрес по протоколу ipv6

if (!preg_match("/^$user@($domain|(\[($ipv4|$ipv6)\]))$/", $email) {
 $emailErr = "Некорректно введён email";
}
?>

Данная регулярка удобна тем, что шаблоны для разных частей формата email-адреса объявляются отдельно. Валидацию пройдут email не только с буквенными именами почтового домена, но и почтовым сервером, представленным в виде ip адреса.

Главный минус этой регулярного выражения в том, что его нужно постоянно корректировать в соответствие изменениям в названиях email-адресов. Например, домены с русскими именами в зоне ".рф" регулярка выше уже не пропустит.

Начиная с PHP 5.2, появилась возможность выполнить эту проверку встроенной функцией PHP filter_var(). Вот как это делается с её помощью:

<?php
$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
 $emailErr = "Некорректно введён email";
}
?>

Рекомендуем использовать именно этот способ проверки email-адреса, так как сегодня и в будущем вы будете уверены, что она работает как нужно. Разработчики языка PHP сами внесут нужные корректировки в новых версиях.

Используя код из приведенного ниже примера, мы можем проверить, содержит ли поле нашей формы действительный URL-адрес. Обратите внимание, что в URL-адресе в этом случае разрешены как слэши (/), так и дефисы (-). Если введенное значение не соответствует условиям, то пользователю будет отображено сообщение об ошибке:

<?php
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
 $websiteErr = "Некорректно введён URL";
}
?>

Объединим все рассмотренные выше все проверки полей ввода в одной форме и напишем следующий код:

<?php
// определяем переменные и устанавливаем пустые значения
$nameErr = $emailErr = $educationErr = $websiteErr = "";
$name = $email = $education = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Введите имя";
  } else {
    $name = test_input($_POST["name"]);
    // проверяем, содержит ли имя только буквы и пробелы
    if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
      $nameErr = "Имя должно содержать только буквы и пробелы"; 
    }
  }

  if (empty($_POST["email"])) {
    $emailErr = "Введите Email";
  } else {
    $email = test_input($_POST["email"]);
    // проверьте, правильно ли сформирован адрес электронной почты
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Неверный формат электронной почты"; 
    }
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
    // проверьте, правильность синтаксиса URL-адреса
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
      $websiteErr = "Некорректный URL"; 
    }
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["education"])) {
    $educationErr = "Выберите образование";
  } else {
    $education = test_input($_POST["education"]);
  }

?>

Вы можете попытаться ввести корректные и некорректные данные в представленной выше форме и посмотреть работу, написанного в этом уроке, сценария PHP.

В следующем уроке мы выведем введенные пользователем данные на экран.