|
 |
CIX. Функции для работы с регулярными выражениями (Perl-совместимые)
Синтакcис шаблонов, используемых в функциях этого раздела, во многом похож на
синтаксис, используемый в Perl. Выражение должно быть заключено в ограничители,
например, прямые слеши '/'. Ограничителем могут выступать произвольные символы, кроме
буквенно-цифровых и обратного слеша '\'. Если ограничительный символ встречается в
шаблоне, его необходимо экранировать. Начиная с PHP 4.0.4 в качестве ограничителя
доступны комбинации, используемые в Perl: (), {}, [] и <>. Подробней
об этом рассказано в разделе Синтаксис регулярных выражений.
После закрывающего ограничителя можно указывать различные модификаторы,
влияющие на работу регулярных выражений.
Детальная информация доступна в разделе
Модификаторы шаблонов.
PHP также поддерживает POSIX-совместимые регулярные выражения, используя
соответствующий модуль.
Поддержка Perl-совместимых регулярных выражений реализована в соответствующей
PCRE библиотеке, которая распространяется с открытым исходным кодом.
Автором библиотеки является Philip Hazel, авторские права принадлежат
кембриджскому университету, Англия. Исходный код доступен по ссылке
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/.
Внимание |
Также вы должны учитывать некоторые ограничения PCRE. Ознакомьтесь с
http://www.pcre.org/pcre.txt для получения более
полной информации.
|
Начиная с PHP 4.2.0, Perl-совместисмые регулярные выражения (PCRE) доступны по умолчанию. Вы можете
отключить их при помощи
--without-pcre-regex.
В случае, если вы хотите использовать библиотеку, отличную от идущей в стандартной
поставке РНР, используйте опцию
--with-pcre-regex=DIR
для указания директории, содержащей необходимые файлы.
Если у вас версия PHP менее, чем 4.2.0, вам необходимо сконфигурировать и
пересобрать PHP с опцией
--with-pcre-regex[=DIR],
чтобы включить поддержку PCRE-функций.
Версия PHP для
Windows имеет встроенную поддержку данного расширения. Это означает, что
для использования данных функций не требуется загрузка никаких
дополнительных расширений. Данное расширение не определяет никакие директивы конфигурации в php.ini. Данное расширение не определяет никакие типы ресурсов.
Перечисленные ниже константы определены данным расширением и могут быть
доступны только в том случае, если PHP был собран с
поддержкой этого расширения или же в том случае, если
данное расширение подгружается во время выполнения.
Таблица 1. PREG константы константа | описание |
---|
PREG_PATTERN_ORDER |
Меняет порядок элементов в результирующем массиве так, чтобы
элемент $matches[0] содержал полные вхождения шаблона,
элемент $matches[1] - все вхождения первой взятой в круглые скобки подмаски, и так далее.
Только reg_match_all() реагирует на данный модификатор;
остальными функциями он игнорируется.
| PREG_SET_ORDER |
Меняет порядок элементов в результирующем массиве так, чтобы
элемент $matches[0] содержал первый набор вхождений (полное вхождение,
вхождение первой подмаски, заключенной в круглые скобки...),
аналогично элемент $matches[1] - второй набор вхождений, и так далее.
Только reg_match_all() реагирует на данный модификатор;
остальными функциями он игнорируется.
| PREG_OFFSET_CAPTURE |
Смотрите описание флага
PREG_SPLIT_OFFSET_CAPTURE.
Данный флаг доступен в PHP 4.3.0 и выше.
| PREG_SPLIT_NO_EMPTY |
В случае, если этот флаг указан, функция preg_split()
вернет только непустые подстроки.
| PREG_SPLIT_DELIM_CAPTURE |
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в
разделяющем шаблоне, также извлекается из заданной строки и возвращается
функцией. Этот флаг был добавлен в PHP 4.0.5.
| PREG_SPLIT_OFFSET_CAPTURE |
В случае, если этот флаг указан, для каждой найденной подстроки будет указана
ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет
формат возвращаемых данных: каждое вхождение возвращается в виде массива,
в нулевом элементе которого содержится найденная подстрока, а в первом - смещение.
Этот флаг доступен в PHP 4.3.0 и выше и используется только в
функции preg_split().
|
Пример 1. Примеры правильных шаблонов /<\/\w+>/ |(\d{3})-\d+|Sm /^(?i)php[34]/ {^\s+(\s+)?$}
|
Пример 2. Примеры неправильных шаблонов
/href='(.*)' - пропущен закрывающий ограничитель
/\w+\s*\w+/J - неизвестный модификатор 'J'
1-\d3-\d3-\d4| - пропущен открывающий ограничитель
|
- Содержание
- Модификаторы шаблонов -- Описывает возможные модификаторы шаблонов Perl-совместимых регулярных выражений (PCRE)
- Синтаксис регулярных выражений -- Описание синтаксиса Perl-совместимых регулярных выражений (PCRE)
- preg_grep --
Возвращает массив вхождений, которые соответствуют шаблону
- preg_match_all -- Выполняет глобальный поиск шаблона в строке
- preg_match -- Выполняет проверку на соответствие регулярному выражению
- preg_quote -- Экранирует символы в регулярных выражениях
- preg_replace_callback -- Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова
- preg_replace -- Выполняет поиск и замену по регулярному выражению
- preg_split -- Разбивает строку по регулярному выражению
Функции для работы с регулярными выражениями (Perl-совместимые)
alexbodn at 012 dot n@t dot il
08-Jan-2006 06:45
here is an annotation to my note from 28-Apr-2005 03:52, due to the welcome contribution of dipesh khakhkhar:
Here is a small function to determine whether a string is a preg expression.
Please note, that a dot '.' character in a regexp may match any character, including a dot, thus a string containing a dot may well be interpreted as an ordinary string, or a regexp.
function preg_ispreg($str)
{
$prefix = "";
$sufix = "";
if ($str[0] != '^')
$prefix = '^';
if ($str[strlen($str) - 1] != '$')
$sufix = '$';
$estr = preg_replace("'^/'", "\\/", preg_replace("'([^/])/'", "\\1\\/", $str));
if (@preg_match("/".$prefix.$estr.$sufix."/", $str, $matches))
return strcmp($str, $matches[0]) != 0;
return true;
}
alexbodn at 012 dot n@t dot il
27-Apr-2005 06:52
Here is a small function to determine whether a string is a [valid] preg expression.
function preg_ispreg($str)
{
$prefix = "";
$sufix = "";
if ($str[0] != '^')
$prefix = '^';
if ($str[strlen($str) - 1] != '$')
$sufix = '$';
$estr = preg_replace("'^/'", "\\/", preg_replace("'([^/])/'", "\\1\\/", $str));
if (@preg_match("/".$prefix.$estr.$sufix."/", $str, $matches))
return strcmp($str, $matches[0]) != 0;
return false;
}
Ned Baldessin
23-Oct-2004 06:08
If you want to perform regular expressions on Unicode strings, the PCRE functions will NOT be of any help. You need to use the Multibyte extension : mb_ereg(), mb_eregi(), pb_ereg_replace() and so on. When doing so, be carefull to set the default text encoding to the same encoding used by the text you are searching and replacing in. You can do that with the mb_regex_encoding() function. You will probably also want to set the default encoding for the other mb_* string functions with mb_internal_encoding().
So when dealing with, say, french text, I start with these :
<?php
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
setlocale(LC_ALL, 'fr-fr');
?>
steve at stevedix dot de
20-Jul-2004 05:17
Something to bear in mind is that regex is actually a declarative programming language like prolog : your regex is a set of rules which the regex interpreter tries to match against a string. During this matching, the interpreter will assume certain things, and continue assuming them until it comes up against a failure to match, which then causes it to backtrack. Regex assumes "greedy matching" unless explicitly told not to, which can cause a lot of backtracking. A general rule of thumb is that the more backtracking, the slower the matching process.
It is therefore vital, if you are trying to optimise your program to run quickly (and if you can't do without regex), to optimise your regexes to match quickly.
I recommend the use of a tool such as "The Regex Coach" to debug your regex strings.
http://weitz.de/files/regex-coach.exe (Windows installer) http://weitz.de/files/regex-coach.tgz (Linux tar archive)
hrz at geodata dot soton dot ac dot uk
06-Mar-2002 11:33
If you're venturing into new regular expression territory with a lack of useful examples then it would pay to get familiar with this page:
http://www.pcre.org/man.txt
| |