Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода ТОБД.doc
Скачиваний:
24
Добавлен:
13.04.2015
Размер:
8.25 Mб
Скачать

Тема № 6. Использование регулярных выражений в сценариях рнр

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

До настоящего момента предполагалось, что пользователь всегда вводит правильные данные и не действует злонамеренно. В данной теме мы усовершенствуем рассмотренные примеры и организуем проверку целостности данных форм. Проверка ошибок не только обеспечивает удаление неполной и неправильной информации, но и обеспечивает более эффективный и удобный интерфейс.

Проверка ошибок

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

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

Задание 1. Вывод информации о ошибочно заполненных полях формы

Мы последовательно проверяем все поля формы и убеждаемся в том, что они не остались пустыми. Там, где это возможно, проверяется правильность структуры введенных данных. Если проверка прошла успешно, мы переходим к следующему полю; в противном случае программа выводит сообщение об ошибке, устанавливает флаг, который позднее используется для повторного отображения формы, и переходит к следующему полю. Процедура повторяется до тех пор, пока не будут проверены все поля формы (рис. 3.41, файл Lab6_0.php).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title></title>

</head>

<body bgcolor="#ffffff" text="#000000" link="#cbda74"

vlink="#808040" alink="#808040">

<? PHP

$name = $_POST['name']; //$name=$_REQUEST['name'];

$seenform=$_POST['seenform'];

$email=$_POST['email'];

// Создать форму

$form = "

<form action=\"Lab6_0.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"z\">

<b>Введите информацию</b><br>

Ваше имя:<br>

<input type=\"text\" name=\"name\" size=\"20\" maxlength=\"20\" value=\"$name\"><br>

Ваш Email:<br>

<input type=\"text\" name=\"email\" size=\"20\" maxlength=\"40\" value=\"$email\"><br>

<input type=\"submit\" value=\"Отправить\">

<br>Lab6_0.php. Обработка ошибок при вводе

<br>неправильного Email производится в этом же файле

</form>";

if ($seenform != "z"): // Заполнялась ли форма ранее?

print "$form"; //echo " Первая прорисовка формы";

else:

// Пользователь заполнил форму. Проверить введенные данные.

//echo " form нарисована $name";

$error_flag = "n"; //признак что ошибок нет

if ($name == ""):

// Убедиться в том, что поле имени содержит информацию

print "<font color=\"red\"> Вы забыли ввести Ваше имя </font><br>";

$error_flag = "y";//признак наличия ошибоки

endif;

// Убедиться в том. что поле адреса содержит информацию

if ($email == ""):

$error_flag = "y";

print "<font color=\"red\">Укажите правильный email address! Он не должен быть пустым.</font><br>";

else:

//Преобразовать все алфавитные символы в адресе электронной почты

//к нижнему регистру

$email = strtolower(trim($email));

endif;

if(!empty($_POST['email']))

{

// Убедиться в правильности синтаксиса адреса электронной почты

//Будем считать, что стандартный адрес электронной почты выглядит так:

// admin@mail.ru

//Адрес состоит из двух частей это:

// admin - имя пользователя.

// mail.ru - домен, доменное имя.

//Их разделяет знак @(собака).

//Имя пользователя - может состоять из букв разного регистра,

//цифр, знаков подчёркивания, точек, минусов.

//Доменное имя - так же может состоять из букв разного

//регистра, цифр, знаков подчёркивания, точек, минусов.

if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email'])):

echo $_POST['email']. " Email - Правильный.";

$error_flag = "n";

else:

$error_flag = "y";

echo $_POST['email']. " Email - НЕправильный.";

print "<font color=\"red\"> Пример правильного возможного email: admin@mail.ru</font><br>";

endif;

}

else

{ echo "Вы не ввели email."; }

if ($error_flag == "y"):

// Если флаг ошибки $error_flag установлен, то заново отобразить форму.

print "$form";

else: // Обработать данные пользователя

print "<br>Данные введены правильно";

endif;

endif;

?>

</body>

</html>

Рис. 3.41. Проверка данных формы и вывод сообщений об ошибках. Lab6_0.php.

На экране форма будет представлена в виде (рис. 3.42).

Рис. 3.42. Форма ввода для листинга приведенного на рис. 3.41.

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

Отметим, что в функцию preg_match передаются два параметра – шаблон, которому должен соответствовать email адрес и собственно сам адрес, введенный пользователем $_POST['email']

if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email']))

Шаблон , с которым функция preg_match будет сравнивать email адрес, может выглядеть так:

1. "[0-9a-z_]+@[0-9a-z_^\.]+" - это часть паттерна (шаблона), проверяющая имя пользователя, собаку и домен второго уровня до точки.

2. "\.[a-z]{2,6}" - эта часть проверяет домен первого уровня (ru,com,ua и т.д.).

Объединим всё и получим такой шаблон:

"|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}|i"

В конце шаблона присутствует модификатор i он сообщает интерпретатору, что поиск проводится без учёта регистра, т.е. могут присутствовать и заглавные буквы и прописные.

Как известно, у адреса две составляющие - имя пользователя и имя домена, которые разделены знаком @. Для проверки разделителя между именем пользователя и именем домена в шаблоне (регулярном выражении) указано +@.

На рис. 3.43 приведен пример вывода сообщения об ошибочных действиях пользователя при заполнении формы на рис. 3.42.

Рис. 3.43. Заполненная форма ввода для листинга приведенного на рис. 3.41.

Подчеркнем, что в первой половине e-mail адреса могут присутствовать только цифры, латинские буквы, точка, тире и знак подчёркивания, причем начианаться адрес должен с буквы. В домене могут быть только цифры, латинские буквы, тире и точки.

Также не забывайте, что электронный ящик может находиться на поддомене xxx@xxx.xxx.com, или даже на домене четвертого, пятого уровня (как вариант, реально эта ситуация крайне редка, но отбрасывать эти адреса не стоит). Поэтому в регулярном выражении не забывайте использовать точку (экранированную "\.") для указания того, что часть адреса после "@" может содержать точку как разделитель доменных имен.

Для проверки доменного имени первого уровня учитываем, что его длина уже составляет не только 2 символа (.ru) или 3 символа (.com), но и 4 символа - .info, и даже 6 символов. Поэтому в шаблоне присутствует выражение:

"\.[a-z]{2,6}$/i"

Проверка осуществляется по этому шаблону с применением функции preg_match():

- Функция bool preg_match( string $expr, string $str [,list &$pockets] ) сопоставляет выражение $expr в строке $str.