Продолжаем изучение регулярных выражений в php-скриптах (3,4)
12.11.08Мой Компьютер, №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;
}
?>
(Окончание следует)
Web-droid редактор
Не пропустите интересное!
Підписывайтесь на наши каналы и читайте анонсы хай-тек новостей, тестов и обзоров в удобном формате!


Samsung Galaxy A36 и Galaxy A56 — доступные флагманские технологии



У Samsung Galaxy A36 и Galaxy A56 одинаково хорошие дисплеи, емкие аккумуляторы, есть поддержка обновлений софта в течение 6 лет. Расскажем подробнее чем еще они интересны

Первая квантовая система навигации оказалась в 50 раз точнее GPS навигация
Австралийская компания Q-CTRL впервые публично продемонстрировала собственную квантовую навигационную систему под названием Ironstone Opal, которая работает полностью автономно и не нуждается в GPS.
Audi A6 Sedan будет выпускаться в версии мягкого гибрида Audi автомобиль
Audi A6 Sedan с классическим для бизнес-класса кузовом дополнила представленную ранее в марте A6 Avant и, как и универсал, построена на платформе Premium Platform Combustion (PPC).