PHP Формы — Проверка имени, E-mail и URL
В данной статье, мы рассмотрим возможности PHP проверить, корректно ли в форме указан адрес электронной почты (email), имя пользователя и URL-адрес.
Проверка валидности имени на PHP
В приведенном ниже коде показан простой способ проверки валидности введённого пользователем имени. Согласно регулярке в поле name
можно вводить только латинские буквы, дефисы, апострофы и пробелы. Если значение поля имени не соответствует шаблону, то в переменную $nameErr
сохраним сообщение об ошибке:
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
$nameErr = "Введите корректное имя";
}
?>
Примечание: Функция preg_match()
ищет в строке $name
шаблон, возвращая true
, если шаблон существует, и false
, если данные в строке не соответсвуют шаблону.
Но что если нужно, чтобы имя было ТОЛЬКО на латинице или ТОЛЬКО на кирилице и ограничить длину до 30 символов? Например, для полных имён типа "Максим Максимов-Суханов" или "Maxim Maximov-Sukhanov", естественно только на одном из языков регулярное выражение примет следующий вид (бонусом можно писать украинские имена):
$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 на PHP
Как известно 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:
$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()
. Вот как это делается с её помощью:
$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Некорректно введён email";
}
?>
Рекомендуем использовать именно этот способ проверки email-адреса, так как сегодня и в будущем вы будете уверены, что она работает как нужно. Разработчики языка PHP сами внесут нужные корректировки в новых версиях.
Проверка URL-адреса в PHP
Используя код из приведенного ниже примера, мы можем проверить, содержит ли поле нашей формы действительный URL-адрес. Обратите внимание, что в URL-адресе в этом случае разрешены как слэши (/)
, так и дефисы (-)
. Если введенное значение не соответствует условиям, то пользователю будет отображено сообщение об ошибке:
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "Некорректно введён URL";
}
?>
Проверка имени, email и URL-адреса в PHP
Объединим все рассмотренные выше все проверки полей ввода в одной форме и напишем следующий код:
Пример
Попробуй сам »<?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.
В следующем уроке мы выведем введенные пользователем данные на экран.