Пример использования приведенных выше метасимволов:
/\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 = "Доцент Смирнов совершил".
"открытие. Его учителем была ".
"профессор Иванова. ".
"Этим открытием Смирнов ".
"завоевал себе степень ".
"доктора. Раньше он был ".
"только кандидат.";