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

Мой Компьютер, №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;

}

?>

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

Avatar photo
Robo User
Web-droid редактор

Не пропустите интересное!

Підписывайтесь на наши каналы и читайте анонсы хай-тек новостей, тестов и обзоров в удобном формате!

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

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

Читайте також Read more




Статьи & тестыArticles

Обзор смартфона Oppo A6 Pro: амбициозный Oppo A6 Pro (CPH2799)

Новый смартфон Oppo A6 Pro — телефон среднего уровня с функциональностью смартфонов премиум-класса. Производитель наделил его множеством характеристик, присущих более дорогим телефонам. Но не обошлось и без компромиссов. Как именно сбалансирован Oppo A6 Pro – расскажем в обзоре.


Выбор редакции 2025. Лучшие устройства года по версии hi-tech.ua best devices 2025

Лучшие игровые ноутбуки, мышки для работы, клавиатуры для игр, смартфоны и беспроводные наушники 2025 года. Среди них мы отметим самые интересные и те что можем рекомендовать купить.  


НовостиNews
| 19.03
На россии полностью заблокируют YouTube
youtube

Российские власти продолжают сужать доступ граждан к независимым источникам информации. После блокировки Instagram, Facebook, WhatsApp, Discord, Viber и даже игры Roblox

| 16.52
ЕС отменил запрет продавать автомобили с ДВС после 2035 года  
mercedes-benz-gls-brabus-850-xl-1

Европейский союз пересмотрел подход к регулированию продаж автомобилей с двигателями внутреннего сгорания и отказался от идеи полного запрета