DL
16.2.2001
И вот, наконец, серия выпусков про регулярные выражения подходит к концу. Поговорим о регулярных выражениях совместимых с Perl (Perl compatible regular expressions? PCRE).
Самое главное их преимущество перед POSIX, как мне уже подсказывают ? возможность "жадного" поиска. Вопросительный знак в PCRE выступает еще и как минимизатор квантификатора:
.*?
Найдет минимальную подходящую строку. Вроде бы ничего особенного? Нет, это очень особенная вещь. Например, какой пример я приводил в прошлом выпуске про печатную версию текста?
$text = ereg_replace("<a +href=([^>]+)>[^<]+</a>", "\\0 [\\1]", $text);
То есть, внури ссылки не должно быть тегов (например "<a href=...><b>...</b></a>"). Если же сделать так:
$text = ereg_replace("<a +href=([^>]+)>.*</a>", "\\0 [\\1]", $text);
Тогда мы получим... Правильно, весь текст между началом первой и концом последней ссылки.
Все проблемы снимает жадный поиск.
$text = preg_replace("/<as+href=(.*?)>.*?</a>/", "\\0 [\\1]", $text);
Программа подберет для всех ссылок минимальную подходящую строку, т.е. только до тега "</a>". Описывать значение такой особенности PCRE нет смыла ? оно огромное. :) Идем дальше.
Цифры теперь можно обозначить не как "[0-9]", а просто "\d". Не-цифры ("[^0-9]") как "\D". Очень удобно. Вот остальные обозначения:
\w | [a-z0-9] |
\W | [^a-z0-9] |
\s | [ ] |
\S | [^ ] |
Рекомендую заглянуть в выпуски про поиск ? там эти символы используются.
Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. Для чего нужен первый слэш, не знаю. Последний нужен для отделения шаблона от параметров. Параметры, которые я понял, таковы:
i | регистронезависимый поиск |
m | многостроковый режим. По умолчанию PCRE ищет сопвадения с шаблоном только внутри одной строки, а символы "^" и "$" совпадают только с началом и концом всего текста. Когда этот параметр установлен, "^" и "$" совпадают с началом и концом отдельных строк. |
s | символ "." (точка) совпадает и с переносом строки (по умолчанию ? нет) |
A | привязка к началу текста |
E | заставляет символ "$" совпадать только с концом текста. Игнорируется, если установлен парамерт m. |
U | Инвертирует "жадность" для каждого квантификатора (если же после квантификатора стоит "?", этот квантификатор перестает быть "жадным"). |