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|.)» (здесь точка экранируется обратным слэшем, чтобы она понималась как обычная точка, без специального значения).
В нескольких примерах мы уже использовали подвыражения. Настало время разобраться, что же это такое и какими свойствами они обладают
В РВ подшаблоны выделяют, заключая в круглые скобки. Для их обозначения кроме термина «подшаблон» также используют термин «подвыражение». Подшаблоны могут быть вложенными. Выделение части регулярного выражения в виде регулярного подвыражения делает следующее.
Например, шаблон
жар(кое|птица|)
- совпадает с одним из слов «жаркое», «жарптица» и «жар». Тогда как без скобок это было бы «жаркое», «птица» и пустая строка.
Например, имеется такой шаблон:
победитель получит
((золотую|позолоченный)
(медаль|кубок))
- и строка, в которой ищутся совпадения с этим шаблоном: «победитель получит золотую медаль». Тогда кроме этой фразы будут еще захвачены и выданы как результаты поиска следующие совпадения в подвыражениях: «золотую медаль», «золотую», «медаль», пронумерованные 1, 2, 3 соответственно.
Однако это не всегда удобно. Для того чтобы избавиться от «захватывающего» эффекта подвыражения, после открывающей скобки пишут «?:». Тогда это подвыражение в результат поиска не включается и при нумерации остальных подшаблонов с «захватывающим» эффектом не учитывается.
победитель получит
((?:золотую|позолоченный)
(медаль|кубок))
Тогда в условиях предыдущего примера получим искомую строку «победитель получит золотую медаль» и строки «золотую медаль», «медаль», пронумерованные 1 и 2 соответственно.
Если в html-файле название находится после <body> и отделено от него только пробелами или переводами строк, заключено в тег <h1> и после него тоже может идти сколько-то пробелов и переводов строк, то его можно найти с помощью следующего скрипта:
<?
//считываем файл в строку
$str = file_get_contents('1.htm');
$pattern = '/<body.*?>[
s]*<h1>'.
'(.*?)</h1>[
s]*/m';
// осуществляем поиск
$n = preg_match_all ($pattern, $str, $res);
echo $res[1][0]; // выводим заголовок
?>
Заметим, что здесь выводится первое захваченное подвыражение, поскольку нам интересно только само название, а не все РВ. Так как в этом РВ есть только одно подвыражение, то его значение содержится в нулевом элементе первого массива результатов.
В предыдущих примерах мы часто писали комбинации типа dd. Это значит, что цифра должна повторяться два раза. А что же делать, если повторений очень много или мы не знаем, сколько именно? Оказывается, нужно использовать специальные метасимволы.
Повторения описываются с помощью так называемых квантификаторов (метасимволов, задающих количественные отношения). Существует два типа квантификаторов: общие (задаются с помощью фигурных скобок) и сокращенные (это исторически сложившиеся сокращения наиболее распространенных квантификаторов).
Квантификаторы могут следовать за любым из перечисленных элементов: