ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Конвертация даты. Проверка правильности ввода e-mail. Проверка правильности ввода URL. Проверка правильности ввода имени. Проверка правильности ввода числа. Корректность ввода даты

Проверка

Конвертация даты из формата YYYY-MM-DD в DD.MM.YYYY

Рассмотрим скрипт позволяющий осуществить преобразование даты из формата YYYY-MM-DD в формат DD.MM.YYYY. Эта задача решается с помощью функции preg_match():

int preg_match (string pattern, string str [, array regs])

Данная функция ищет в строке str соответствие регулярному выражению, заданному в шаблоне pattern. Если соответствия подвыражений с шаблонами будут найдены, то они сохраняться в массиве regs. При этом $regs содержит копию строки string, $regs[1] — подстроку, начинающуюся с первой сохраняющей скобки, $regs[2] — подстроку, начинающуюся со второй сохраняющей скобки и т.д.

Функция возвращает число найденных соответствий.

Пример:

<?php
$date="2009-02-23";
if(preg_match("|([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})|i",$date,$regs)){
echo "$regs[3].$regs[2].$regs[1]";
}
else {
echo "Неверный формат даты: $date";
}
?>

В окне веб-браузера это будет выглядеть ТАК.

Проверка правильности ввода e-mail

В данном примере проверяется на предмет корректности проверяется адрес электронной почты, вводимый пользователем.

Будем исходить из того, что адрес должен иметь вид sevidi@server.com. У адреса две составляющие — имя пользователя и имя домена, которые разделены знаком @. В имени пользователя могут присутствовать буквы нижнего и верхнего регистров, цифры, знаки подчеркивания, минуса и точки. Для проверки разделителя между именем пользователя и именем домена в выражение требуется добавить @. Таким образом, регулярное выражение, проверяющее имя пользователя и наличие разделителя, имеет следующий вид:

"[0-9a-z_]+@[0-9a-z_^\.]+"

Для проверки последнего доменного имени (.ru, .com) необходимо добавить следующее выражение:

"\.[a-z] {2, 3}"

Cимвол "." в регулярных выражениях используется для обозначения любого символа, поэтому для поиска соответствия точки в регулярном выражении этот символ экранируется: "\.".

Объединяя эти строки, можно получить следующее выражение в формате Perl для проверки адресов электронной почты:

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

Проверка правильности ввода URL

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

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

http://хост/путь

Простейшим вариантом проверки, не позволяющим посетителю ошибаться при наборе URL, но в то же время не предотвращающий неверный формат, является:

"#http://[^]*\.html?#i"

Данное выражение учитывает только URL расширения файла html либо htm, для обобщения на другие файлы следует расширить регулярное выражение до:

"#http://[^]*\.(html?|php|pl|cgi)#i"

Уточняя регулярное выражение, разместим за префиксом http:// регулярное выражение для хоста — [-a-z0-9_.]+. Структура пути может быть более разнообразной. Для него необходимо использовать выражение вида:

[-a-z0-9_:@&?=+,.!/~*'%$]*

Объединяя все в одно регулярное выражение, получаем следующее:

"#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi)#i"

Проверка правильности ввода имени

Вводимая пользователем информация (имя и пароль) как с использованием метода GET, так и метода POST должна быть тчательно проверена на содержание инъекционных SQL-запросов, функции system() и т.п. Если имя пользователя не должно содержать ничего кроме букв, то для этого следует воспользоваться следующим регулярным выражением в формате Perl:

"|^[\w]+$|i"

которое соответствует строке, содержащей одну или более букв, где символ ^ соответствует началу строки, a $ — концу строки. Если кроме букв в имени или пароле следует разрешить использование чисел или пробельных символов, то регулярное выражение следует расширить следующим образом:

"|^[\w\d\s]+$|i"

Впрочем, использование символов табуляции, конца файла и т.п. является не лучшим решением, поэтому целесообразно заменить символ \s просто пробелом:

"|^[\w\d ]+$|i"

Если в имени используются инициалы, оно может включать завершающие точки, например "Иванов В.И.". Использовать точки напрямую нельзя и их следует экранировать, т.к. символ точки является специальным символом, соответствующим любому одному символу:

"|^[\w\d\. ]+$|i"

В тексте вводимом пользователем, могут быть любые символы, но символы прямых одинарных кавычек (') и точки с запятой (;) способны приводить к возможности осуществления зловредного кода. Запретить использование данных символов можно при помощи следующего регулярного выражения:

"|^[^';]+$|i"

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

А теперь, создадим HTML-форму.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Проверка правильности ввода имени</title>
</head>

<body bgcolor="#CCFFFF">
<form action="" method="post">
<table border="0">
<tr>
<td width="86" valign="top">Имя</td>
<td width="150"><input name="name" type="text" size="25" maxlength="30"> </td>
</tr>
<tr>
<td>Пароль</td>
<td><input name="password" type="password" size="25" maxlength="30"></td>
</tr>
<tr>
<td>E-mail</td>
<td><input name="email" type="text" size="25" maxlength="30"></td>
</tr>
<tr>
<td>URL</td>
<td><input name="url" type="text" size="25" maxlength="30"></td>
</tr>
<tr>
<td valign="top">Сообщение</td>
<td><textarea name="message" cols="76" rows="3"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input name="send" type="submit" value="Отправить"> </td>
</tr>
</table>
</form>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Форма содержит четыре текстовых поля: name — имя пользователя, password — его пароль, email —его адрес электронной почты, url — ссылка на ресурс, текстовую область для ввода сообщения message и кнопку send для отправки данных обработчику, код которого представлен ниже.

<?php
//Извлекаем данные из суперглобального массива $_POST
$name=$_POST['name'];
$password=$_POST['password'];
$email=$_POST['email'];
$message=$_POST['message'];
$url=$_POST['url'];
if (!preg_match("|^[\w\d\. ]+$|i",$name))
exit ("Неверный формат имени");
if(!preg_match("|^[\w\d\. ]+$|i", $password))
exit("Неверный формат пароля");
if(!preg_match("|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}|i", $email))
exit("Неверный формат E-mail");
if(!preg_match("|^[^';]+$|i", $message))
exit("Неверный формат E-mail");
if(!preg_match("#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi|ru)#i", $url))

exit("Неверный формат URL");
/*дальнейшая обработка данных -проверка правильности пароля и занесение сообщения в базу данных или файл*/
?>

Проверка правильности ввода числа

В HTML-формах веб-приложений часто требуется ввод чисел. Кроме того, практически все веб-приложения, имеющие в своей основе базу данных, передают первичные ключи через строку запроса. Например, URL

http://sevidi.ru/forum/read.php?id_forum=1&id_theme=495

содержат два числовых параметра: id_forum и id_theme, которые принимают значения 1 и 495 соответственно. Дотошные посетители страницы могут попытаться присвоить этим параметрам совершенно другие значения, а то и подставить вместо цифр текст с SQL-инъекцией. Поэтому все числовые параметры следует проверять — они должны содержать только цифры от 0 до 9.

<?php
if(!preg_match("|^[\d]*$|", $_GET['id_theme'])) exit();
if(!preg_match("|^[\d]*$|", $_GET['id_forum'])) exit();
?>

Приведенный код допускает использование в качестве параметров id_forum и id_theme либо целые числа, либо пустое значение. Если пустое значение параметров недопустимо, следует заменить символ * (любое число символов) на + (хотя бы один символ).

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

<?php
$zip="435673"; //Почтовый индекс
$passport_seria="4567"; //Серия паспорта
$passport_number="123456"; //Номер паспорта
if(!preg_match("|^[\d]{6}$|", $zip))
exit("Введите почтовый индекс в формате # # # # # #");
if(!preg_match("|^[\d]{6}$|", $passport_seria))
exit("Введите серию паспорта в формате # # # # ");
if(!preg_match("|^[\d]{6}$|", $passport_number))
exit("Введите номер паспорта в формате # # # # # #");
?>

В окне веб-браузера это будет выглядеть ТАК.

Обработка целочисленных значений является самой простой и распространенной задачей. Более сложной проблемой является обработка чисел с плавающей точкой. В этом случае число может предваряться знаком плюс или минус, которые могут и отсутствовать. Это решается при помощи квантификатора ?, допускающего и отсутствие символа, и присутствие его в одном экземпляре:

"[-+]?"

Мантиссе числа соответствует рассмотренное ранее выражение

"[\d]+"

После точки (которую необходимо экранировать) следует дробная часть, которая описывается так же выражением

"[\d]+"

Теперь, объединяя фрагменты, можем получить шаблон для чисел с плавающей точкой:

"|^[-+]?[\d]+\.[\d]+$|"

Завершающим штрихом будет учет разного формата разделителя мантиссы и дробной части, в качестве которой может выступать как точка(23.56), как и запятая (23,56). Для учета чисел в обоих форматах, регулярное выражение следует исправить следующим образом:

"|^[-+]?[\d]+[\.,][\d]+$|"

Корректность ввода даты

Корректность ввода даты может быть произведена с помощью следующего скрипта:

<?php
$date= "2009.02.23"; //гггг.мм.дд
if (!preg_match("|^[0-9]{4}.[0-9]{2}. [0-9]{2}$|i",$date)){
echo"Введите дату в формате гггг.мм.дд ";
}
else {
echo "Дата введена правильно";
}
?>

В окне веб-браузера это будет выглядеть ТАК.

Только русский текст

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

"|^[а-я] + $|i"

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

"|^[-а-я\s\.,;:\?!]+$|i"

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

Автоподсветка URL

В гостевых книгах, форумах и чатах — везде, где пользователи оставляют данные сообщения с ворохом ссылок на другие ресурсы, встает задача автоматического преобразования URL в гиперссылку. При размещении текста

". . . на ресурсе, посвященном РНР-программированию, вы можете найти . . ."

Эта задача решается с помощью скрипта

<?php
$text="...на ресурсе, посвященном РНР-программированию, http://www.softtime.ru вы можете найти ...";
$patern="/(http:\/\/|)(\S+)/i";
$replacment='<a href="http://\\2">\\2</a>';
echo preg_replace($patern, $replacment, $text);
?>

В окне веб-браузера это будет выглядеть ТАК.

Конвертирование тегов в стиль форума phpBB и обратно

В Интернете получили большое распространение теги в квадратных скобках, именуемые также тегами в стиле phpBB(известного и широко распространенного форума). Удобство использования таких тегов заключается в том, что все теги HTML можно запретить, преобразуя их при помощи функции htmlspecialchars() в безопасную форму, и в тоже время разрешить пользователю использоватьих эквиваленты. Например,[i] вместо <i> и [code] вместо <code>. Теги в квадратных скобках можно заменить на теги в угловых скобках уже после преобразования текста при помощи функции htmlspecialchars(). Чаще всего прибегают к тегам [url], которые имеют следующий синтаксис:

[url = ссылка] имя_ссылки[/url]

При выводе на страницу этот шаблон следует преобразовать в

<a href = ссылка>имя_ссылки </a>

Для этого предназначен нижеследующий скрипт:

<?php
$text= "... на следующем [url= http://www.softtime.ru] ресурсе [/url] вы можете найти ...";
$patern= "#\[[\s]*url[\s]*=[\s]*([^\]]*)\]([^\[]*)\[[\s]*/url[\s]*\]#i";
$replacment='<a href=\\1>\\2</a>';
echo preg_replace($patern, $replacment, $text);
?>

В окне веб-браузера это будет выглядеть ТАК.

Квадратные скобки в искомой фразе необходимо экранировать. Кроме того, во все позиции. где могут встречаться пробелы, необходимо поместить подстроку [\s]*, соответствующую любому количеству пробельных символов, в т.ч. и нулевому. В веб-приложении может потребоваться решение и обратной задачи — преобразование тега <a> в тег с квадратными скобками.

Пример:

<?php
$str="<a href=http://www.softtime.ru>Ресурс по РНР</a>";
$pat="#<[\s]*a[\s]*href[\s]*=[\s]*([^>]*)>([^<]*)<[\s]*/[\s]*a[\s]*>#";
$replacement="[url=\\1]\\2[/url]";
echo preg_replace($pat, $replacement, $str);
?>

В окне веб-браузера это будет выглядеть ТАК.

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

[img = ссылка]имя_ссылки [/img]

При выводе на страницу этот шаблон следует преобразовать в

<img src = ссылка>имя_ссылки </a>

Для этого предназначен следующий скрипт:

<?php
$text="... следующее изображение [img=../images/foto15.gif]";
$patern="#\[[\s]*img[\s]*=[\s]*([^\]]*)\]([^\[]*)#";
$replacment='<img src=\\1>';
echo preg_replace($patern, $replacment, $text);
?>

В окне веб-браузера это будет выглядеть ТАК.

Обратную задачу по преобразованию тегов в теги с квадратными скобками решает ниже следующий скрипт:

<?php
$str="<img src=../images/foto15.gif>";
$pattern="/<img[\s]*src[\s]*=[\s]*([^>]*)>/i";
$replacement="[img=\\1]";
echo preg_replace($pattern, $replacement, $str);
?>

В окне веб-браузера это будет выглядеть ТАК.