Ниже приводится коллекция общих кодов функций для регулярных выражений PHP, которые помогут вам изучить регулярное выражение PHP
preg_grep.
(PHP 4, PHP 5)
preg_grep — возвращает описания ячеек массива, соответствующие шаблону
array preg_grep ( шаблон строки, ввод массива [, int flags] )
preg_grep() Возвращает массив, содержащий ячейки входного массива, соответствующие заданному шаблону шаблона.
флагами могут быть следующие флаги:
PREG_GREP_INVERT
Если передать этот флаг, preg_grep() возвращает ячейки во входном массиве, которые не соответствуют заданному шаблону. Этот тег доступен начиная с PHP 4.2.0.
Начиная с PHP 4.0.4, результаты, возвращаемые preg_grep(), индексируются с использованием ключей из входного массива. Если вам не нужны такие результаты, используйте array_values() для переиндексации результатов, возвращаемых preg_grep().
Выше приведено описание preg_grep() в руководстве. Прежде всего, это регулярная функция, совместимая с Perl, поэтому я предполагаю, что preg_grep означает p(perl)reg(regular)_grep. Ее особенностью является то, что ее можно использовать для массивов. Благодаря собственному расширению ее можно использовать и для регулярных функций. соответствие в многомерных массивах, и он может возвращать совпадающий или несовпадающий массив через параметр flags. Его эффективность намного выше, чем при использовании структуры foreach(...){if...} (не проверено), и она может сопоставлять сложные шаблоны. Он очень полезен в таких приложениях, как поиск и сортировка.
пример:
<?
$arr = array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
// Возвращаем все элементы массива, содержащие числа с плавающей запятой.
$fl_array = preg_grep ("/^(d+)?.d+$/", $arr);
print_r ($ fl_array);
?>
preg_match
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match — инструкции по сопоставлению регулярных выражений
int preg_match (шаблон строки, тема строки [, совпадения массива [, флаги int]])
ищет в строке темы содержимое, соответствующее регулярному выражению, заданному шаблоном.
Если имеются совпадения, они будут заполнены результатами поиска. $matches[0] будет содержать текст, соответствующий всему шаблону, $matches[1] будет содержать текст, соответствующий первому захваченному подшаблону в скобках, и так далее.
флагами могут быть следующие флаги:
PREG_OFFSET_CAPTURE
Если этот флаг установлен, соответствующее смещение строки также будет возвращено для каждого совпадения. Обратите внимание, что это изменяет значение возвращаемого массива так, что каждая ячейка в нем также является массивом, где первый элемент — это совпавшая строка, а второй элемент — ее смещение. Этот тег доступен начиная с PHP 4.3.0.
Параметр flags доступен начиная с PHP 4.3.0.
preg_match() возвращает количество совпадений с шаблоном. Либо 0 раз (нет совпадения), либо 1 раз, поскольку preg_match() прекратит поиск после первого совпадения. preg_match_all(), наоборот, будет искать до конца темы. Если возникает ошибка, preg_match() возвращает FALSE.
Совет: Если вы просто хотите узнать, содержится ли одна строка в другой строке, не используйте preg_match(). Вместо этого вы можете использовать strpos() или strstr(), что намного быстрее.
Выше приведено описание preg_match() в руководстве. Я думаю, что функция этой функции заключается в том, что ее можно использовать для проверки, то есть соответствует ли определенная строка определенным требованиям. Ограничение состоит в том, что, как упоминалось выше, оно соответствует либо 0 раз, либо 1 раз. Возвращаемое значение — это количество совпадений. Когда требуется полное совпадение, можно использовать preg_match_all(). Также стоит упомянуть роль массива $matches, который можно использовать в качестве возвращаемого значения собственного шаблона, что иногда бывает полезно.
Пример:
<?
if (preg_match ("/(bwebb)s(d)/i", "PHP — это язык сценариев Web 45, Web 34 по выбору.", $match)) {
print "Соответствие найдено.";
print_r ($ совпадение);
} еще {
print "Соответствие не найдено.";
}
?>
<?php
// Получаем имя хоста по URL
preg_match("/^(http://)?([^/]+)/i",
" http://www.php.net/index.html ", $matches);
$host = $matches[2];
// Получаем следующие два сегмента из имени хоста
preg_match("/[^./]+.[^./]+$/", $host, $matches);
echo "имя домена: {$matches[0]}n";
?>
preg_match_all
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match_all — выполнить глобальное сопоставление регулярных выражений. Объяснение этой функции в руководстве очень ясное, поэтому я не буду объяснять ее дальше.
иллюстрировать
int preg_match_all (шаблон строки, тема строки, совпадения массива [, int flags])
ищет весь контент в теме, который соответствует регулярному выражению, заданному шаблоном, и помещает результаты в совпадения в порядке, указанном флагами.
После того как первое совпадение найдено, последующие поиски начинаются с конца предыдущего совпадения.
flags может представлять собой комбинацию следующих флагов (обратите внимание, что нет смысла использовать PREG_PATTERN_ORDER и PREG_SET_ORDER вместе):
PREG_PATTERN_ORDER
Отсортируйте результаты так, чтобы $matches[0] представлял собой массив всех совпадений с шаблоном, $matches[1] — это массив строк, совпадающих с подшаблоном в первой скобке, и так далее.
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U", "<b>пример: </b><div align=left>это тест</div >",
$out, PREG_PATTERN_ORDER);
напечатайте $out[0][0].", ".$out[0][1]."n";
напечатайте $out[1][0].", ".$out[1][1]."n";
?>
Этот пример выведет:
<b>пример: </b>, <div align=left>это тест</div>
пример: , это тест.
Следовательно, $out[0] содержит строку, соответствующую всему шаблону, а $out[1] содержит строку между парой HTML-тегов.
PREG_SET_ORDER
Отсортируйте результаты так, чтобы $matches[0] был массивом первого набора совпадений, $matches[1] — массивом второго набора совпадений и так далее.
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
"<b>пример: </b><div align=left>это тест</div>",
$out, PREG_SET_ORDER);
напечатайте $out[0][0].", ".$out[0][1]."n";
напечатайте $out[1][0].", ".$out[1][1]."n";
?>
Этот пример выведет:
<b>пример: </b>, пример:
<div align=left>это тест</div>, это тест
В этом примере $matches[0] — это первый набор результатов сопоставления, $matches[0][0] содержит текст, соответствующий всему шаблону, $matches[0][1] содержит текст, соответствующий первому подшаблону. , заканчиваясь И так далее. Аналогично, $matches[1] — это второй набор совпадений и так далее.
PREG_OFFSET_CAPTURE
Если этот флаг установлен, соответствующее смещение строки также будет возвращено для каждого совпадения. Обратите внимание, что это изменяет значение возвращаемого массива, так что каждая ячейка также является массивом, где первый элемент — это совпавшая строка, а второй элемент — ее смещение внутри субъекта. Этот тег доступен начиная с PHP 4.3.0.
Если тег не указан, предполагается PREG_PATTERN_ORDER.
Возвращает количество совпадений всего шаблона (возможно, ноль) или FALSE в случае ошибки.
Пример 1. Получить все номера телефонов из текстового сообщения
<?php
preg_match_all ("/(? (d{3})? )? (?(1) [-s] ) d{3}-d{4}/x",
«Позвоните 555-1212 или 1-800-555-1212», $phones);
?>
Пример 2. Поиск совпадающих HTML-тегов (жадный)
<?php
// \2 — пример обратной ссылки, ее значение в PCRE такое:
// Должно соответствовать содержимому второго набора скобок в самом регулярном выражении, в данном случае
// Это ([w]+). Поскольку строка заключена в двойные кавычки, вам необходимо
//Добавляем дополнительную обратную косую черту.
$html = "<b>жирный текст</b><a href=howdy.html>нажмите на меня</a>";
preg_match_all ("/(<([w]+)[^>]*>)(.*)(</\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "соответствует: ".$matches[0][$i]."n";
echo "часть 1: ".$matches[1][$i]."n";
echo "часть 2: ".$matches[3][$i]."n";
echo "часть 3: ".$matches[4][$i]."nn";
}
?>
preg_quote
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_quote — экранирование описания символа регулярного выражения
string preg_quote ( string str [, разделитель строки] )
preg_quote() принимает str в качестве параметра и добавляет обратную косую черту перед каждым символом, принадлежащим к синтаксису регулярного выражения. Если вам нужно сопоставить динамически сгенерированную строку с шаблоном, вы можете использовать эту функцию для экранирования специальных символов, которые она может содержать.
Если указан необязательный разделитель аргументов, этот символ также будет экранирован. Его можно использовать для экранирования разделителя, требуемого функцией PCRE. Наиболее часто используемый разделитель — косая черта /.
Специальные символы для регулярных выражений включают: . + * ? $ ( ) { } = !
Примечание. Эту функцию можно безопасно использовать с двоичными объектами.
Выше приведено объяснение в руководстве, которое очень понятно, поэтому я не буду вдаваться в подробности. Кроме того, в руководстве есть примечание, что эту функцию можно безопасно использовать для бинарных объектов, что очень полезно.
Пример: Пример 1. Пример preg_quote()
<?php
$keywords = '40 долларов за g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords // возвращает $40 для g3/400;
?>
Пример 2. Добавление курсива к слову в тексте
<?php
// В этом примере preg_quote($word) используется для исключения звездочки из регулярного выражения
// Имеет особое значение.
$textbody = "Эту книгу *очень* трудно найти.";
$word = "*очень*";
$textbody = preg_replace ("/".preg_quote($word)."/",
"<i>".$word."</i>",
$текстбоди);
?>
Следующим шагом будет применение функции preg_replace, которая является сверхгибкой, сверхмощной и широко используемой.
preg_replace
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace – выполняет поиск и замену регулярных выражений
смешанный preg_replace (смешанный шаблон, смешанная замена, смешанная тема [, int limit])
ищет в теме совпадения шаблона и заменяет их заменой. Если указан лимит, будут заменены только лимит совпадений. Если лимит не указан или имеет значение -1, будут заменены все совпадения.
замена может содержать обратную ссылку в форме \n или (начиная с PHP 4.0.4) в форме $n, причем последняя предпочтительнее. Каждая такая ссылка будет заменена текстом, соответствующим n-му захваченному подшаблону в квадратных скобках. n может находиться в диапазоне от 0 до 99, где \0 или $0 относится к тексту, соответствующему всему шаблону. Подсчитайте левую скобку слева направо (начиная с 1), чтобы получить количество подшаблонов.
Для шаблонов замены, которые следуют за обратной ссылкой по номеру (то есть числу, которое следует сразу за соответствующим шаблоном), привычное обозначение \1 не может использоваться для представления обратной ссылки. Например, \11 приведет к тому, что preg_replace() запутается, хочет ли он обратную ссылку \1 , за которой следует число 1, или обратную ссылку \11 . Решением в этом случае является использование ${1}1. При этом создается изолированная обратная ссылка на $1, а остальная единица остается просто литералом.
Если совпадение найдено, замененная тема будет возвращена, в противном случае будет возвращена исходная тема.
Каждый параметр preg_replace() (кроме лимита) может быть массивом. Если и шаблон, и замена являются массивами, они будут обработаны в том порядке, в котором их ключи появляются в массиве. Это не обязательно совпадает с числовым порядком индекса. Если индекс используется для определения того, какой шаблон какой заменой должен быть заменен, массив следует отсортировать с помощью ksort() перед вызовом preg_replace().
Если субъект является массивом, поиск и замена выполняются для каждого элемента в теме и возвращается массив.
Если и шаблон, и замена являются массивами, preg_replace() извлечёт из них значения для поиска и замены субъекта. Если в замене меньше значений, чем в шаблоне, в качестве оставшегося значения замены используется пустая строка. Если шаблон представляет собой массив, а замена — это строка, эта строка используется в качестве значения замены для каждого значения в шаблоне. Наоборот бессмысленно.
Модификатор /e заставляет функцию preg_replace() рассматривать аргумент замены как PHP-код (после замены соответствующих обратных ссылок). Совет: Убедитесь, что замена образует допустимую строку кода PHP, иначе PHP сообщит об ошибке синтаксического анализа в строке, содержащей preg_replace().
Примечание. Параметр limit был добавлен после PHP 4.0.1pl2.
Я думаю, что его сила в том, что он может обрабатывать не только строки, но и массивы, а его функция обратной ссылки очень гибкая. По сути, он может удовлетворить большинство потребностей обычных пользователей. Если он не компетентен, у нас также есть функция preg_replace_callback(), которая может настроить функцию обратного вызова в соответствии с вашими расширенными требованиями. Например, разработка фильтров и т. д.
preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback — использовать функцию обратного вызова для выполнения поиска по регулярным выражениям и инструкций замены.
смешанный preg_replace_callback (смешанный шаблон, обратный вызов, смешанный субъект [, ограничение int])
Эта функция ведет себя почти так же, как preg_replace(), за исключением того, что вместо предоставления параметра замены указывается функция обратного вызова. Эта функция принимает на вход массив совпадений в целевой строке и возвращает строку, используемую для замены.
Пример 1. Пример preg_replace_callback()
<?php
// Этот текст за 2002 год,
// Теперь хотим сделать его доступным для 2003 года
$text = "День дурака 01.04.2002n";
$text.= "Последнее Рождество было 24.12.2001n";
// функция обратного вызова
функция next_year($matches) {
// Обычно: $matches[0] — полное совпадение
// $matches[1] соответствует подшаблону в первой скобке
// и так далее
вернуть $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(d{2}/d{2}/)(d{4})|",
"следующий_год",
$текст);
//Результат:
// День дурака 01.04.2003
// Последнее Рождество было 24.12.2002.
?>
Часто вам понадобится функция обратного вызова для preg_replace_callback() только в одном месте. В этом случае вы можете использовать create_function(), чтобы объявить анонимную функцию в качестве обратного вызова в вызове preg_replace_callback(). храните всю информацию для вызова в одном месте и не загромождайте пространство имен функций именами функций обратного вызова, которые больше нигде не используются.
Друзьям, которые используют функцию preg_replace_callback(), вероятно, понадобится функция обратного вызова (иначе зачем ее использовать? Не лучше ли использовать preg_replace напрямую), но она часто используется только в одном месте. В этом случае вы можете использовать create_function(), чтобы объявить анонимную функцию в качестве функции обратного вызова preg_replace_callback(). Таким образом, мы удовлетворяем потребность в объявлении информации, не запутываясь в имени функции, которая больше не будет использоваться.
Пример 2. preg_replace_callback() и create_function()
<?php
/* Фильтр командной строки в стиле UNIX, удаляющий строку в начале каждого абзаца.
*Преобразуйте заглавные буквы в строчные*/
$fp = fopen("php://stdin", "r") or die("не могу прочитать стандартный ввод");
в то время как (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>s*w|',
create_function(
// Использование одинарных кавычек здесь имеет решающее значение,
// В противном случае замените все $ на $
'$соответствия',
'return strtolower($matches[0]);'
),
$строка
);
эхо $строка;
}
fclose($fp);
?>
Наконец
preg_split
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_split – Разделение строки с помощью регулярных выражений. Я не буду здесь вдаваться в подробности.
иллюстрировать
array preg_split ( шаблон строки, строка субъекта [, int limit [, int flags]] )
возвращает массив, содержащий подстроки в теме, разделенные по границам, соответствующим шаблону.
Если указан предел, возвращается не более подстрок предела. Если предел равен -1, это означает, что предела нет, и его можно использовать для продолжения указания дополнительных флагов параметров.
флаги могут представлять собой любую комбинацию следующих флагов (в сочетании с побитовым оператором ИЛИ | ):
PREG_SPLIT_NO_EMPTY
Если этот флаг установлен, preg_split() возвращает только непустые компоненты.
PREG_SPLIT_DELIM_CAPTURE
Если этот флаг установлен, выражения скобок в шаблонах разделителей также фиксируются и возвращаются. Этот тег был добавлен в PHP 4.0.5.
PREG_SPLIT_OFFSET_CAPTURE
Если этот флаг установлен, также будет возвращено соответствующее смещение строки для каждого появления соответствующего результата. Обратите внимание, что это изменяет значение возвращаемого массива, так что каждая ячейка также является массивом, где первый элемент — это совпавшая строка, а второй элемент — ее смещение внутри субъекта. Этот тег доступен начиная с PHP 4.3.0.
Совет: Если вам не нужны возможности регулярных выражений, вы можете использовать более быстрые (и простые) альтернативы, такие как взрыв() или str_split().