В приложении интеллектуальной формы отправки регулярные выражения могут быть применены, по меньшей мере, в двух случаях. Во-первых, для выявления конкретных терминов в данных обратной связи, поступающих от клиентов. Использование регулярных выражений позволяет несколько упростить решение этой задачи. Используя строковую функцию для сопоставления строк 'shop ', 'customer service', 'retail', нам приходилось выполнять три различных поиска. С мопощью регулярного выражения можно сопоставить сразу со всеми тремя строками:
shop|customer service|retail
Второе применение — проверка правильности адреса электронной почты клиента путем кодирования стандартизованного формата адреса электронной почты в регулярном выражении. Формат включает некоторые алфавитно-цифровые символы и символы пунктуации, за которыми следуют символ @, затем строка алфавитно-цифровых символов или дефисов, затем точка, затем опять алфавитно-цифровые символы и дефисы и, возможно, дополнительные точки, вплоть до конца строки. Этот формат можно закодировать следующим образом:
^[a-zA-Z0-9_ \-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$
Подвыражение A[a-zA-Z0-9_ \-\.]+ означает "начало строки по меньшей мере с одной буквы, цифры или символа подчеркивания, или какого-либо их сочетания".
Символ @ соответствует литеральному значению @.
Подвыражение [a-zA-Z0-9\-]+ соответствует первой части имени хоста, включающего алфавитно-цифровые символы и дефисы. Обратите внимание, что перед символом дефиса поставлена косая черта, поскольку внутри квадратных скобок он является специальным символом.
Комбинация \. соответствует литералу .. Поскольку символ точки используется вне класса символов, она должна отменяться, дабы соответствовать литеральной точке.
Подвыражение [a-zA-Z0-9\-\.]+$ соответствует остальной части имени домена, включающего буквы, цифры, дефисы и дополнительные точки, если они требуются, вплоть до конца строки.
Небольшой анализ показывает, что можно ввести неправильные адреса электронной почты, которые все же будут соответствовать этому регулярному выражению. Практически невозможно предусмотреть все возможные варианты адресов, но это регулярное выражение позволит все-таки немного улучшить ситуацию. Вы можете усовершенствовать это выражение многими способами. Например, можно воспользоваться списком действительных доменов верхнего уровня. Однако в этом случае следует соблюдать осторожность при установлении различных ограничений, поскольку проверочная функция, отвергающая хотя бы 1% допустимых данных, вызывает большее раздрожение, чем аналогичная функция, пропускающая 10% недопустимых данных.
Теперь, когда читатели познакомились с регулярными выражениями, давайте рассмотрим PHP-функции, в которых они используются.
Поиск подстрок — это основное применение только что рассмотренных регулярных выражений. В РНР существуют две функции, предназначенные для сопоставления с регулярными выражениями: ereg () и eregi ().
Функция ereg() имеет следующий прототип:
int ereg (string pattern, string search [, array matches]);
Эта функция выполняет поиск в строке search, отыскивая в ней соответствия с регулярным выражением, определенным в шаблоне pattern. Если соответствия подвыражений с шаблоном pattern будут найдены, они сохраняются в массиве соответствий matches, по одному подвыражению в каждом элементе массива.
Функция eregi() идентична предыдущей, за исключением того, что она не чувствительна к регистру.
Мы можем адаптировать интеллектуальную форму отправки электронной почты под использование регулярных выражений.
if (!eregi('^[a-zA-Z 0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z 0-9\-\.]+$', $email))
{
echo 'Этот адрес электронной почты не является допустимым.'
.' Пожалуйста вернитесь на предыдущую страницу и попытайтесь еще раз';
//Завершение выполнения сценария
exit;
}
$toaddress = '[email protected]'; //значение по умолчанию
if (eregi ('магазин|сервис|розница', $feedback))
$toaddress = '[email protected]';
else if(eregi ('получил|выполнил', $feedback))
$toaddress = '[email protected]';
else if(eregi ('счет'|'расчет', $feedback))
$toaddress = '[email protected]';
if (eregi ('bigcustomer\.com', $email))
$toaddress = '[email protected]';
else
echo '<p>Ваше сообщение отправлено</p>';
Внесите соответствующие изменения в обработчик HTML-формы process.php.
Откройтеи страницу с формой и протестируйте скрипт.
В окне веб-браузера это будет выглядеть ТАК.
Регулярные выражения можно использовать также для поиска и замены подстрок так же, как это делалось с помощью функции str_replace(). Для выполнения этой задачи существуют две функции: ereg_replace() и eregi_replace(). Функция ereg_replace() имеет следующий прототип:
string ereg_replace (string pattern, string replacement, string search);
Эта функция ищет регулярное выражение pattern в строке search и заменяет его строкой replacement.
Функция eregi_replace() идентична предыдущей, но не чувствительна к регистру.
Еще одна полезная функция обработки регулярных выражений — split(), которая имеет следующий прототип:
array split (string pattern, string search [, int max]);
Эта функция разделяет строку search на подстроки по регулярному выражению pattern и возвращает подстроки в массив. Целочисленный параметр max ограничивает количество элементов, которые могут быть помещены в массив.
Эта функция может оказаться полезной для разделения имен доменов или дат. Например:
$address = '[email protected]';
$arr = split ('\.|@', $address);
while (list ($key, $value) = each ($arr))
echo "<br>". $value;
В окне веб-браузера это будет выглядеть ТАК.
Этот фрагмент кода разделяет адрес электронной почты на три фрагмента и выводит каждый из них в отдельной строке.
В общем случае функции регулярных выражений выполняются менее эффективно, чем строковые функции с аналогичными возможностями. Если стоящая перед вами задача достаточно проста, чтобы можно было использовать строковые функции, то им и следует отдать предпочтение.
На освоение регулярных выражений потребуется некоторое время — чем больше примеров вы рассмотрите и выполните, тем увереннее будете чувствовать себя по отношению к регулярным выражениям.