Продолжаем изучение регулярных выражений в php-скриптах (3,4)

 | 11.37

Мой Компьютер, №09 (513), 14.07.2008

Эпизод 1. Будьте проще — и люди к вам потянутся!

Те читатели, которые решали задачи, приведенные в конце предыдущей статьи, думаю, заметили одну неприятную вещь — ну уж сильно громоздки паттерны.

Табл. 1

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

Ситуацию немного спасает возможность указания диапазонов, но если нам нужны символы из разных диапазонов (например, либо буквы, либо цифры), конструкция все равно становится громоздкой. А представьте, что мы хотим найти любой символ — что тогда делать? В меньшей степени, но все же так же громоздко смотрятся и квантификаторы — необходимо указывать «от» и «до». К счастью, в синтаксисе регулярных выражений предусмотрены специальные обозначения для часто используемых диапазонов и квантификаторов (таблица 1).

Табл. 2

При использовании одного стандартного диапазона символов квадратные скобки можно не указывать. Например, если мы хотим найти цифровой символ, то в паттерне его можно обозначить как d, а не как [d]. Можно совмещать стандартные диапазоны друг с другом и с диапазонами или перечнями, которые определяются вручную. Например, как в таблице 2.

Еще одна возможность упростить написание перечня символов состоит в том, что можно не «заслэшивать» символ «-», для этого его следует поместить сразу после открывающей квадратной скобки : [-w] означает «любая буква, подчеркивание или дефис».

Табл. 3

Табл. 4

Сокращенные написания существуют и для трех наиболее часто используемых квантификаторов. См. таблицу 3.

Вооружившись только что полученными знаниями, напишем более простые паттерны для решения задач из прошлой статьи (таблица 4).

Эпизод 2. Если я этого не хочу

Иногда проще указать символы, которые не должны входить в некоторую группу, нежели перечислять символы, которые туда должны войти. Например, мы должны разбить некоторый текст на отдельные слова. Для этого можно написать паттерн, состоящий из группы всех символов, которые могут встретиться в словах. А перечень этих символов очень большой — все латинские и русские буквы, цифры, специальные символы… Получится довольно громоздкий шаблончик. А ведь многие спецсимволы еще придется «заслэшить».

Выход в данной ситуации очень простой — если логически подумать, то текст состоит из слов и знаков препинания. Следовательно, надо выбирать последовательности символов, которые не являются пробелами и знаками препинания. То есть все символы, которые не входят в группу [s.,:?!()]. Итак, остается только указать, что надо искать не символы, входящие в эту группу, а как раз те, которые в данный перечень не входят. Для этого существует специальный метасимвол «^», который указывается сразу после открывающей квадратной скобки: [^s.,:?!()]+.

Ниже указан код скрипта, который разбивает текст, введенный в область ввода, на слова:

<?php

if (isset($_REQUEST[«text»]))

{

if (preg_match_all(«/[^s.,:?!()]+/», $_REQUEST[«text»], $matches))

{

$result = «<ul><li>».implode(«</li><li>», $matches[0]).»</li></ul>»;

}

else

$result = «»;

}

?>

<form id=»checkform» name=»checkform» action=»example3.php» method=»post»>

<table width=»250″>

<tr>

<td>

Введите текст:

</td>

</tr>

<tr>

<td>

<textarea id=»text» name=»text» style=»width:100%;» rows=»5″><?php echo $_REQUEST[«text»]; ?></textarea>

</td>

</tr>

<tr>

<td align=»center»>

<input type=»submit» value=»Проверить»>

</td>

</tr>

</table>

</form>

<?php

if (isset($_REQUEST[«text»]))

{

?>

<br>

<?php

echo $result;

}

?>

Мой Компьютер, №10 (514), 21.07.2008

Эпизод 3. В поисках альтернативы

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

альтернатива 1Ѕальтернатива 2Ѕ…Ѕальтернатива n

Количество альтернатив не ограничено, можно указывать и пустые альтернативы (они будут соответствовать пустой строке).

Если в паттерне встречается несколько альтернативных конструкций, то их рекомендуется локализировать при помощи круглых скобок. В частности, когда два выбора из альтернатив следуют один за другим, то без локализации никак не обойтись. К примеру, если мы ищем текст, в котором сначала идет буква a или b, а потом c или d, то правильным паттерном будет (aЅb)(cЅd). Если мы напишем паттерн без скобок aЅbcЅd, то данная конструкция будет распознана как выбор из трех альтернатив — a, bc или d.

Также следует обращать внимание на порядок записи альтернатив. Поиск ведется слева направо и останавливается на первой найденной. Поэтому, если одна из альтернатив включает в себя другую, то частный случай следует указывать первым. К примеру, если мы хотим выделить в тексте слова hell и hello, то правильным паттерном будет helloЅhell. Паттерн hellЅhello выделит только совпадения hell (в т.ч. и те, которые входят в состав слов hello).

И в качестве последнего примера укажу шаблон для проверки соответствия введенного значения формату даты: d{2}(/Ѕ-Ѕ.)d{2}(/Ѕ-Ѕ.)(d{4}Ѕd{2}). Здесь все три альтернативные конструкции локализированы, а в конструкции, которая ищет две или четыре цифры года, на первом месте стоит четырехпозиционное число для года, т.к. оно включает в себя второй вариант.

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

<?php

if (isset($_REQUEST[«date»]))

{

if (preg_match(«/d{2}(/|-|.)d{2}(/|-|.)(d{4}|d{2})/», $_REQUEST[«date»]))

$result = «Введенный текст является датой»;

else

$result = «Введенный текст не является датой»;

}

?>

<form id=»checkform» name=»checkform» action=»example4.php» method=»post»>

<table width=»250″>

<tr>

<td>

Дата:

</td>

<td>

<input type=»text» id=»date» name=»date» size=»15″ value=»<?php echo $_REQUEST[«date»]; ?>»>

</td>

</tr>

<tr>

<td colspan=»2″ align=»center»>

<input type=»submit» value=»Проверить»>

</td>

</tr>

</table>

</form>

<?php

if (isset($_REQUEST[«date»]))

{

?>

<br>

<?php

echo $result;

}

?>

(Окончание следует)

Robo User
Web-droid editor

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *