Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Регулярные выражения в PHP
Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону.
Например шаблон "Вася(.*)Пупкин" позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов.
Если надо найти шесть цифр, то пишем "[0-9]{6}" (если, например, от шести до восьми цифр, тогда "[0-9]{6,8}").
Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:
<набор символов><квантификатор><жадность>
Вместо набора символов может быть использовано обозначение любого символа - точка,
может быть указан конкретный набор символов (поддерживаются последовательности - упоминавшиеся "0-9").
Может быть указано "кроме данного набора символов".
Указатель количества символов в официальной документации по php называется "квантификатор".
Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное
значение - либо одно фиксированное ("{6}"), либо как числовой промежуток ("{6,8}"),
так и абстрактное "любое число, в т.ч. 0" ("*"), "любое натуральное число" - от 1 до бесконечности
("+": "document[0-9]+.txt"), "либо 0, либо 1" ("?").
По умолчанию квантификатор для данного набора символов равен единице ("document[0-9].txt").
Для более гибкого поиска сочетаний эти связки "набор символов - квантификатор" можно объединять в метаструктуры.
Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена.
Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же,
пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями
ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки,
а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.
Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая "там" строка.
Из примеров: поисковый код , в котором из строки
поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы
(вернее, все пробелы сжимаются: " +" заменяется на один пробел).
При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв.
Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны.
Например, сложную замену в большом тексте ими лучше не делать.
Ведь, к примеру, комбинация "(.*)" в программном плане означает перебор всех символов текста.
А если шаблон не привязан к началу или концу строки, то и сам шаблон "двигается" программой через весь текст,
и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация "(.*)"
означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста.
Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций).
Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше,
но важен сам порядок цифр.
Набор символов
. | точка | любой символ |
[<символы>] | квадратные скобки | класс символов ("любое из"). Например [abcdef] |
[^<символы>] | негативный класс символов ("любое кроме") | |
- | тире | обозначение последовательности в классе символов ("[0-9]" цифры) |
\d | [0-9] | Только цифры |
\D | [^0-9] | Кроме цифр |
\w | [a-z0-9] | Буквы и цифры |
\W | [^a-z0-9] | Кроме букв и цифр |
\s | [ ] | Пробельные символы: пробел, табуляция, перевод строки |
\S | [^ ] | Кроме пробельных символов |
| | (одно|другое) | На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: ... ) |
Не пользуйтесь классом символов для обозначения всего лишь одного (вместо "[ ]+" вполне сойдет " +"). Не пишите в классе символов точку это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).
Квантификатор
Квантификатором можно указать как конкретное значение, так и пределы. Если число заданных подпадает под пределы квантификатора,
фрагмент выражения считается совпавшим с разбираемой строкой. Синтаксис:
{<количество>}
либо
{<минимум>, <максимум>}
Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число:
"{5,}" ("минимум 5"). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:
* | "звёздочка" или знак умножения | {0,} |
+ | плюс | {1,} |
? | вопросительный знак | {0,1} |
На практике такие символы используются чаще, чем фигурные скобки.
Якоря
^ | привязка к началу строки |
$ | привязка к концу строки |
Эти символы должны стоять соответственно в самом начале и в самом конце строки.
Жадность
Вопросительный знак выступает еще и как минимизатор квантификатора:.*?
$str = '[b]жирный текст [b]а тут - еще жирнее[/b] вернулись[/b]';
$to = '<b>$1</b>';
$re1 = '|\[b\] (.*) \[/b\]|ixs';
$re2 = '|\[b\] (.*?) \[/b\]|ixs';
$result = preg_replace($re1, $to, $str);
echo "Жадная версия: ".htmlspecialchars($result)."<br>";
$result = preg_replace($re2, $to, $str);
echo "Ленивая версия: ".htmlspecialchars($result)."<br>";
Результат работы примера:
Жадная версия: <b>жирный текст [b]а тут - еще жирнее[/b] вернулись</b>
Ленивая версия: <b>жирный текст [b]а тут - еще жирнее</b> вернулись[/b]
Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. После второго идут параметры:
i | регистронезависимый поиск |
u | строка в формате UNICODE |
m | многостроковый режим. По умолчанию PCRE ищет совпадения с шаблоном только внутри одной строки, а символы "^" и "$" совпадают только с началом и концом всего текста. Когда этот параметр установлен, "^" и "$" совпадают с началом и концом отдельных строк. |
s | символ "." (точка) совпадает и с переносом строки (по умолчанию нет) |
A | привязка к началу текста |
E | заставляет символ "$" совпадать только с концом текста. Игнорируется, если установлен парамерт m. |
U | Инвертирует "жадность" для каждого квантификатора (если же после квантификатора стоит "?", этот квантификатор перестает быть "жадным"). |
e | Строка замены интерпретитуется как PHP код. |
Функции для работы с регулярными выражениями
- preg_grep - Возвращает массив вхождений, которые соответствуют шаблону
- preg_match - Выполняет проверку на соответствие регулярному выражению. Данная функция ищет только первое совпадение!
- preg_match_all - Выполняет глобальный поиск шаблона в строке
- preg_quote - Экранирует символы в регулярных выражениях. Т.е. вставляет слэши перед всеми служебными символами (например, скобками, квадратными скобками и т.п.), чтобы те воспринимались буквально. Если у вас есть какой-либо ввод информации пользователем, и вы проверяете его с помощью регулярных выражений, то лучше перед этим заэкранировать служебные символы в пришедшей переменной
- preg_replace - Выполняет поиск и замену по регулярному выражению
- preg_replace_callback - Выполняет поиск по регулярному выражению и замену
- preg_split - Разбивает строку по регулярному выражению
preg_grep
Функция preg_grep - Возвращает массив вхождений, которые соответствуют шаблону
Синтаксис
array preg_grep (string pattern, array input [, int flags])
preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.
Параметр flags может принимать следующие значения:
PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива,
которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных.
Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:
// Возвращает все элементы массива,
// содержащие числа с плавающей точкой
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
preg_match
Функция preg_match - Выполняет проверку на соответствие регулярному выражению
Синтаксис
int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern
В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске, и так далее.
flags может принимать следующие значения:
PREG_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке.
Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива,
в нулевом элементе которого содержится найденная подстрока, а в первом - смещение.
Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).
Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.
Рекомендация: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr(), поскольку они выполнят эту задачу гораздо быстрее.
Пример кода
// Символ "i" после закрывающего ограничителя шаблона означает
// регистронезависимый поиск.
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}
Пример кода
/*
Специальная последовательность \b в шаблоне означает границу слова,
следовательно, только изолированное вхождение слова 'web' будет соответствовать
маске, в отличие от "webbing" или "cobweb".
*/
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}
Пример кода
// Извлекаем имя хоста из URL
preg_match("/^(http:\/\/)?([^\/]+)/i",
"http://www.htmlweb.ru/index.html", $matches);
$host = $matches[2];
// извлекаем две последние части имени хоста
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "domain name is: {$matches[0]}\n";
Результат работы примера:
preg_match_all
Функция preg_match_all - Выполняет глобальный поиск шаблона в строке
Синтаксис
int preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]])
Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.
После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.
Дополнительный параметр flags может комбинировать следующие значения
(необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):
PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент
$matches[0] содержит массив полных вхождений шаблона,
элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.
Пример кода
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",
$out, PREG_PATTERN_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";
Результат работы примера:
<b>example: </b>, <div align="left">this is a test</div>
example: , this is a test
Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.
PREG_SET_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом:
элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.
Пример кода
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=\"left\">this is a test</div>",
$out, PREG_SET_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";
Результат работы примера:
<b>example: </b>, example:
<div align="left">this is a test</div>, this is a test
В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.
PREG_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке.
Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива,
в нулевом элементе которого содержится найденная подстрока, а в первом - смещение.
В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.
Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).
Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.
Пример кода
preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
"Call 555-1212 or 1-800-555-1212", $phones);
Пример кода
// Запись \\2 является примером использования ссылок на подмаски.
// Она означает необходимость соответствия подстроки строке, зафиксированной
// второй подмаской, в нашем примере это ([\w]+).
// Дополнительный слеш необходим, так как используются двойные кавычки.
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: " . $matches[0][$i] . "\n";
echo "part 1: " . $matches[1][$i] . "\n";
echo "part 2: " . $matches[3][$i] . "\n";
echo "part 3: " . $matches[4][$i] . "\n\n";
}
Результат работы примера:
matched: <b>bold text</b>
part 1: <b>
part 2: bold text
part 3: </b>
matched: <a href=howdy.html>click me</a>
part 1: <a href=howdy.html>
part 2: click me
part 3: </a>
preg_quote
Функция preg_quote - Экранирует символы в регулярных выражениях
Синтаксис
string preg_quote (string str [, string delimiter])
Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом.
Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.
В случае, если дополнительный параметр delimiter указан, он будет также экранироваться.
Это удобно для экранирования ограничителя, который используется в PCRE функциях.
Наиболее распространенным ограничителем является символ '/'.
В регулярных выражениях служебными считаются следующие символы: . \\ + * ? [ ^ ] $ ( ) { } = ! < > | :
Пример кода
$keywords = "$40 for a g3/400";
$keywords = preg_quote($keywords, "/");
echo $keywords; // возвращает \$40 for a g3\/400
Пример кода
// Выделение курсивом слова в тексте
// В данном примере preg_quote($word) используется, чтобы
// избежать трактовки символа '*' как спец. символа.
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/" . preg_quote($word) . "/",
"<i>" . $word . "</i>",
$textbody);
echo $textbody;
Результат работы примера:
This book is <i>*very*</i> difficult to find.
preg_replace
Функция preg_replace - Выполняет поиск и замену по регулярному выражению
Синтаксис
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement.
В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона;
в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.
Replacement может содержать ссылки вида \\n либо (начиная с PHP 4.0.4) $n, причем последний вариант предпочтительней.
Каждая такая ссылка, будет заменена на подстроку, соответствующую n'нной заключенной в круглые скобки подмаске.
n может принимать значения от 0 до 99, причем ссылка \\0 (либо $0) соответствует вхождению всего шаблона.
Подмаски нумеруются слева направо, начиная с единицы.
При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация,
когда непосредственно за маской следует цифра. В таком случае нотация вида \\n приводит к ошибке:
ссылка на первую подмаску, за которой следует цифра 1, запишется как \\11, что будет интерпретировано как ссылка на одиннадцатую подмаску.
Это недоразумение можно устранить, если воспользоваться конструкцией \${1}1, указывающей на изолированную ссылку на первую подмаску,
и следующую за ней цифру 1.
Пример кода
$string = "April 15, 2003";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\$3";
echo preg_replace($pattern, $replacement, $string);
Результатом работы этого примера будет:
Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение subject, в противном случае будет возвращен исходный текст subject.
Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.
// Использование массивов с числовыми индексами в качестве аргументов
// функции preg_replace()
$string = "The quick brown fox jumped over the lazy dog.";
$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";
$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";
echo preg_replace($patterns, $replacements, $string);
ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);
В случае, если параметр subject является массивом, поиск и замена по шаблону производятся для каждого из его элементов.
Возвращаемый результат также будет массивом.
В случае, если параметры pattern и replacement являются массивами,
preg_replace() поочередно извлекает из обоих массивов по паре элементов и использует их для операции поиска и замены.
Если массив replacement содержит больше элементов, чем pattern, вместо недостающих элементов для замены будут взяты пустые строки.
В случае, если pattern является массивом, а replacement - строкой, по каждому элементу массива pattern будет осущесвтлен поиск
и замена на pattern (шаблоном будут поочередно все элементы массива, в то время как строка замены остается фиксированной).
Вариант, когда pattern является строкой, а replacement - массивом, не имеет смысла.
Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.
Пример кода: Замена по нескольким шаблонам
// Замена по нескольким шаблонам
$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
"/^\s*{(\w+)}\s*=/");
$replace = array ("\\3/\\4/\\1\\2", "$\\1 =");
echo preg_replace($patterns, $replace, "{startDate} = \"1999-5-27\";");
Этот пример выведет:
Пример кода: Использование модификатора /e
// Использование модификатора /e
preg_replace("/(<\/?)(\w+)([^>]*>)/e",
"'\\1'.strtoupper('\\2').'\\3'",
$html_body);
Пример кода: Преобразует все HTML-теги к верхнему регистру
// Конвертор HTML в текст
// $document на выходе должен содержать HTML-документ.
// Необходимо удалить все HTML-теги, секции javascript,
// пробельные символы. Также необходимо заменить некоторые
// HTML-сущности на их эквивалент.
$search = array ("'<script[^>]*?>.*?</script>'si", // Вырезает javaScript
"'<[\/\!]*?[^<>]*?>'si", // Вырезает HTML-теги
"'([\r\n])[\s]+'", // Вырезает пробельные символы
"'&(quot|#34);'i", // Заменяет HTML-сущности
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(\d+);'e"); // интерпретировать как php-код
$replace = array ("",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");
$text = preg_replace($search, $replace, $document);
preg_replace_callback
Функция preg_replace_callback - Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова
Синтаксис
mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])
Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback функцию, которой в качестве входящего параметра передается массив найденных вхождений. Ожидаемый результат - строка, которой будет произведена замена.
Пример кода
/* фильтр, подобный тому, что используется в системах Unix
для преобразования в заглавные начальных букв параграфа */
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
create_function(
// Использование одиночных кавычек в данном случае принципиально,
// альтернатива - экранировать все символы '$'
'$matches',
'return strtolower($matches[0]);'
),
$line
);
echo $line;
}
fclose($fp);
preg_split
Функция preg_split - Разбивает строку по регулярному выражению
Синтаксис
array preg_split (string pattern, string subject [, int limit [, int flags]])
Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern.
В случае, если параметр limit указан, функция возвращает не более, чем limit подстрок.
Специальное значение limit, равное -1, подразумевает отсутствие ограничения, это весьма полезно для указания еще одного опционального параметра flags.
flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора '|'):
PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.
PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне,
также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.
PREG_SPLIT_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки, будет указана ее позиция в исходной строке.
Необходимо помнить, что этот флаг меняет формат возвращаемых данных:
каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом - смещение.
Примеры кода
// Получение подстрок из заданного текста
// разбиваем строку по произвольному числу запятых и пробельных символов,
// которые включают в себя " ", \r, \t, \n и \f
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
// Разбиваем строку на составляющие символы
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
В случае, если после открывающей круглой скобки следует "?:", захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка "the white queen" сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки "white queen" и "queen", и они будут пронумерованы 1 и 2 соответственно:
$r="/the ((?:red|white) (king|queen))/"; 0="the white king"; 1="white king"; 2="king";
Еще про регулярные выражения:
- примеры регулярных выражений
- все функции PHP для работы с регулярными выражениями
- Регулярные выражения в Javascript
Сервисы проверки регулярных выражений:
Читать дальше: Библиотека Curl в PHP
.
Прокомментировать/Отблагодарить