Выбрать главу

Пример использования приведенных выше метасимволов:

/\d\d\d plus \d is \w\w\w/

Это РВ означает: трехзначное число, за которым следует подстрока plus, любая цифра, затем is и слово из трех словарных символов. В частности, данному РВ удовлетворяют строки: «123 plus 3 is sum», «213 plus 4 is 217».

Вообще различают два множества метасимволов: те, что распознаются в любом месте шаблона, за исключением внутренности квадратных скобок, и те, что распознаются внутри квадратных скобок.

Квадратные скобки [ ] применяются для описания подмножеств и внутри регулярного выражения рассматриваются как один символ, который может принимать значения, перечисленные внутри этих скобок. Однако если первым символом внутри скобок является ^, то значением символьного класса могут быть только символы, НЕ перечисленные внутри скобок.

Примеры:

- Символьный класс [абвгд] задает один из символов а, б, в, г, д, а класс [^абвгд] задает любой символ, кроме а, б, в, г, д.

- Если написать [2бул]ки], то это выражение интерпретируется как один из символов 2, б, у, л, за которым следует строка ки], потому что первая встретившаяся закрывающая квадратная скобка (разбор происходит слева направо) заканчивает определение символьного класса. То есть это РВ совпадет с одной из строк 2ки], бки], уки] или лки].

- С помощью РВ [0-9А-Яа-я] можно задать любую букву или цифру.

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

Примеры (^ и $)

$str = "11 aaa bbb ".

"ccc 22 ddd ".

"eee ggg 33";

\

Переходный символ со множеством назначений

^

Отрицание класса, но только если это первый символ (например, «^\d» задает все, кроме цифр)

-

Задает диапазон символов (например, «0-9» задает все цифры, «A-Z» – все латинские буквы)

]

Вычисляет символьный класс

Регулярное выражение /\d\d/m может быть сопоставлено следующим подстрокам: 11, 22, 33. Если в начале РВ стоит ^, то совпадения ищутся в начале строки, поэтому выражение /^\d\d/m найдет только 11.

Когда в конце РВ стоит знак доллара $, поиск производится в конце строки, поэтому выражение /\d\d$/m найдет только 33.

Шаблону же /^\d\d\d$/ будет удовлетворять строка, целиком состоящая из трехзначного числа (т.е. она и начинается и заканчивается этим числом).

-

<?

//считываем файл в строку

$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>";

?>

\

Переходный символ со множеством назначений

^

Объявляет начало объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в начале строки. Альтернатива: «\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 = "Доцент Смирнов совершил".

"открытие. Его учителем была ".

"профессор Иванова. ".

"Этим открытием Смирнов ".

"завоевал себе степень ".

"доктора. Раньше он был ".

"только кандидат.";