Примеры (^ и $) - Пусть дан такой текст, записанный в виде строки:
$str = "11 aaa bbb ".
"ccc 22 ddd ".
"eee ggg 33";
Таблица 13.1.
Метасимволы, распознаваемые ВНУТРИ квадратных скобокМетасимвол | Значение |
---|
\ | Переходный символ со множеством назначений | ^ | Отрицание класса, но только если это первый символ
(например, «^\d» задает все, кроме цифр) | - | Задает диапазон символов (например, «0-9» задает
все цифры, «A-Z» – все латинские буквы) | ] | Вычисляет символьный класс |
Регулярное выражение /\d\d/m может быть сопоставлено следующим подстрокам: 11, 22, 33. Если в начале РВ стоит ^, то совпадения ищутся в начале строки, поэтому выражение /^\d\d/m найдет только 11.
Когда в конце РВ стоит знак доллара $, поиск производится в конце строки, поэтому выражение /\d\d$/m найдет только 33.
Шаблону же /^\d\d\d$/ будет удовлетворять строка, целиком состоящая из трехзначного числа (т.е. она и начинается и заканчивается этим числом).
- Найдем все html-теги, расположенные в начале каждой строки файла 1.htm.
<?
//считываем файл в строку
$str = file_get_contents('1.htm');
$pattern = "!^<[^/]+>!mU";
// осуществляем поиск
$n = preg_match_all ($pattern,
$str, $res);
// выводим результаты
for ($i=0;$i<$n;$i++)
echo htmlspecialchars($res[0][$i]).
"<br>";
?>
Таблица 13.2.
Метасимволы, распознаваемые ВНЕ квадратных скобокМетасимвол | Значение |
---|
\ | Переходный символ со множеством назначений | ^ | Объявляет начало объекта (или строки в
многострочном режиме). То есть этот символ определяет, что
искомый текст должен находиться в начале строки.
Альтернатива: «\A» | $ | Объявляет конец объекта (или строки в
многострочном режиме). То есть этот символ определяет, что
искомый текст должен находиться в конце строки.
Альтернативы: «\Z», «\z» | . | Совпадает с любым символом, кроме символа
перевода строки (по умолчанию) | [ | Начинает определение символьного класса | ] | Заканчивает определение символьного класса | | | Разделяет перечисление альтернативных вариантов | ( | Начинает подшаблон регулярное (подвыражение) | ) | Заканчивает подшаблон | ? | Расширяет значение «(», квантификаторов 0 или 1,
и квантификатор минимизации | * | 0 или больше повторений (квантификатор) | + | 1 или больше повторений (квантификатор) | { | Начинает минимальный/максимальный квантификатор | } | Заканчивает минимальный/максимальный квантификатор |
Шаблон ограничен восклицательными знаками. Первая «^» значит, что мы ищем совпадения в начале строк, потом идет символ «<» – его и ищем в строке, после него должно идти все, что угодно, кроме обратного слэша (конструкция «[^\]» ), «+» говорит, что стоящий перед ним символ повторяется один и более раз и заканчивается все это символом «>». Таким образом, выделяются все теги в начале строк.
- Мы хотим убедиться, что имя автора было записано правильно (сначала фамилия с большой буквы, потом инициалы через точку) и находится в конце строки.
<?
//считываем файл в строку
$str = file_get_contents('1.htm');
$pattern = "!\s[А-Яа-я]+".
"\s([А-Я]\.\s*)([А-Я]\.\s*)$!m";
// шаблон ограничен восклицатель-
// ными знаками, m – модификатор,
// включающий многострочный режим
// первый \s означает, что перед
// фамилией должен идти пустой
// символ (например, пробел)
// [А-Яа-я] задает одну из букв
// алфавита в любом регистре,а в
// комбинации со знаком плюс
// определяет,что эта буква
// повторяется один и более
// раз следующий \s означает, что
// между фамилией и инициалами
// должен быть пробел
// Далее идет подвыражение,
// определяющее инициалы.
// Это буква от А до Я, после
// которой стоит точка ('\.')
// Экранируем точку, чтобы
// избавиться от ее специального
// значения. После буквы с точкой
// может идти или не идти пробел
// или несколько. Вся конструкция
// повторяется минимум два раза.
// Последний символ $ означает,
// что фамилия с инициалами
// должны находиться в конце
// строки.
//осуществляем поиск
$n = preg_match_all ($pattern,
$str, $res);
// выводим результаты
for ($i=0;$i<$n;$i++)
echo htmlspecialchars($res[0][$i]).
"<br>";
?>
Примеры ( | и .) - Пусть имеется некий текст. Нам нужно найти всех упомянутых в нем людей со званиями.
<?
$str = "Доцент Смирнов совершил".
"открытие. Его учителем была ".
"профессор Иванова. ".
"Этим открытием Смирнов ".
"завоевал себе степень ".
"доктора. Раньше он был ".
"только кандидат.";
$pattern = "/(профессор|доцент)".
"\s[А-Яа-я]+(\s|\.)/i";
// осуществляем поиск
$n = preg_match_all ($pattern, $str,
$res);
// выводим результаты
for ($i=0;$i<$n;$i++)
echo htmlspecialchars($res[0][$i]).
"<br>";
?>
Метасимвол прямая черта « | » позволяет задавать альтернативные варианты. В примере мы хотели найти всех профессоров или доцентов. Для этого было создано подвыражение «(профессор|доцент)». После звания через пробел фамилия человека, которому оно принадлежит, – для этого существует комбинация «\s[А-Яа-я]+». После фамилии идет либо опять пробел, либо точка, если это конец предложения. Получаем опять два альтернативных варианта: «(\s|\.)» (здесь точка экранируется обратным слэшем, чтобы она понималась как обычная точка, без специального значения).
|