ли далее bar. Если нет, то совпадение с шаблоном найдено, иначе продолжаем поиск.
Регулярное выражение
(?!foo)bar
не найдет все вхождения bar, перед которыми нет foo, потому что оно «смотрит вперед», а перед ним никаких символов нет. Поэтому в данном шаблоне ?!foo всегда верно.
«Смотрящие назад» утверждения ищут совпадения перед текущей позицией. Позитивные утверждения этого типа начинаются с (?<= , негативные – с (?<! . Смотрящим назад утверждениям позволено искать только строки фиксированной длины, т.е. в них нельзя использовать квантификаторы. Например,
(?<!foo)bar
находит все появления bar, перед которыми нет foo.
В начале лекции мы хотели научиться находить в html-файле упоминание об авторе. Это можно сделать с помощью «смотрящих назад» утверждений в РВ (хотя можно и проще).
<?
//считываем файл в строку
$str = file_get_contents('1.htm');
$pattern = '/(?<=Автор:)s[А-Я]'.
'[а-я]*s([А-Я].s*){1,2}/m';
// осуществляем поиск
$n = preg_match_all ($pattern, $str, $res);
// выводим результаты
for ($i=0;$i<$n;$i++)
echo htmlspecialchars($res[0][$i]).
'<br>';
?>
Часть РВ после утверждения определяет, что мы ищем строку (ФИО), которая начинается с пробела, большой буквы, затем идут маленькие буквы в произвольном количестве, пробел и инициалы через точку. Утверждение задает то, что перед данной строкой должно стоять «Автор:».
Дату можно вычислить похожим образом. Оставляем это в качестве упражнения.
Как в любом языке программирования, в РВ существуют условные конструкции. Применяются они к подвыражениям. То есть можно заставить процессор РВ выбирать подшаблон в зависимости от условия или выбирать между двумя альтернативными шаблонами в зависимости от результата утверждения или от того, совпал ли предыдущий захваченный подшаблон. Существуют две формы условных подвыражений:
(?(условие)шаблон_выполняемый_если_
условие_верно)
(?(условие)шаблон_если_условие_верно
|шаблон_если_условие_неверно)
Существует два типа условий. Если текст между круглыми скобками состоит из последовательности цифр, то условие удовлетворяется, если захваченное подвыражение с этим номером ранее совпало.
( ( )? [^()]+ (?(1) ) )
Первая часть этого РВ опционально совпадает с открывающейся круглой скобкой, и если этот символ присутствует, то устанавливает его как первое захваченное подвыражение.
Вторая часть совпадает с одним или более символами, не заключенными в круглые скобки.
Третья часть РВ – это условное подвыражение, которое проверяет, совпало ли первое множество скобок или нет (попалась ли нам в строке открывающая круглая скобка). Если попалась, то есть объект (строка) начинается с символа «(», то условие верно и вычисляется условный шаблон, а именно требуется наличие закрывающей круглой скобки. В противном случае подшаблон ни с чем не совпадает.
Если условие – не последовательность цифр, то оно должно быть утверждением. Это может быть позитивное или негативное «смотрящее вперед» или «смотрящее назад» утверждение.
(?(?=[^a-z]*[a-z])d{2}-[a-z]{3}-d{2}
|d{2}-d{2}-d{2})
Условие здесь – позитивное «смотрящее вперед» утверждение. Оно совпадает с любой последовательностью не букв, после которых идет буква. Другими словами, оно проверяет присутствие хотя бы одной буквы в строке для поиска. Если буква найдена, то производится сравнение по первому альтернативному варианту шаблона (d{2}-[a-z]{3}-d{2}), иначе – по второму (d{2}-d{2}-d{2}). Этому шаблону удовлетворяют строки двух типов: dd-aaa-dd или dd-dd-dd, где d – любая цифра, a – любая буква.
Заключение
Итак, мы рассмотрели механизм регулярных выражений, их синтаксис и семантику, показали примеры их использования. Безусловно, эта лекция не охватывает все тонкости данного механизма. О регулярных выражениях пишут целые книги! Мы же постарались лишь в общих чертах познакомить читателей с их основами. Вообще механизм регулярных выражений присутствует почти во всех языках программирования с небольшими отличиями, но суть остается той же. Так что надеемся, что знания, полученные в процессе чтения этой лекции, помогут при изучении других языков и пригодятся на практике.
Взаимодействие PHP и XML
Введение
Прежде чем начать изучать способы работы PHP с XML, полезно хотя бы вкратце ознакомиться с самой технологией XML. В первой части лекции будут рассмотрены основные понятия этой технологии, базовый синтаксис XML–документов, области ее применения, а также понятие DOM XML. Вторая часть лекции посвящена непосредственно вопросам обработки XML при помощи PHP. Сюда входит установка расширения DOM XML, описание и примеры использования некоторых встроенных в PHP функций для обработки XML- документов.
В качестве примера рассмотрим XML-файл, содержащий описания личностей, и попытаемся научиться добавлять, удалять и находить личность или отдельные элементы ее описания в этом файле с помощью PHP.