Preg replace примеры. Регулярные выражения в PHP

Регулярные выражения (сокращенно — regex ) представляют собой последовательности символов, которые формируют шаблоны поиска. В основном они используются в шаблонах сопоставления со строками.

Краткая история

  • Все началось в 1940 — 1960-х годах, когда множество умных людей говорили о регулярных выражениях;
  • 1970-е годы g / re / p;
  • 1980 Perl и Генри Спенсер;
  • 1997 PCRE (регулярные выражения, совместимые с Perl). Именно тогда начался взлет того, что мы называем регулярные выражения. PCRE предоставляет библиотеки почти для каждого языка.
Общее использование регулярных выражений в PHP

PHP включает в себя три основные функции для работы с PCRE — preg_match , preg_match_all и preg_replace .

Сравнение соответствия

Выражение возвращает 1 , если соответствие установлено, 0 — если нет, и false — если возникает ошибка:

int preg_match (string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

Регулярного выражения пример, который возвращает количество найденных совпадений:

int preg_match_all (string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Замена

Выражение возвращает замененную строку или массив (на основе объекта $subject ):

mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int $count ]])

Общее использование регулярных выражений в JavaScript

Регулярные выражения в JavaScript выглядят почти так же, как и в PHP .

Сравнение соответствия

Возвращает массив совпадений или null , если совпадений не найдено:

string.match(RegExp);

Замена

Регулярное выражение, которое возвращает строку с выполненными заменами:

string.replace(RegExp, replacement);

Особенности регулярных выражений в JavaScript
  • Точка никогда не соответствует новой строке:
  • Те же методы для сравнения соответствия и замены через регулярное выражение, что и без них.
Принципы составления шаблонов регулярных выражений

Рассмотрим пример, в котором нужно найти адреса электронной почты в базе кода. Наша цель:

Аналоговые сокеты

Регулярные выражения состоят из двух типов символов:

  • специальные символы: ? * + {} () ^ $ / .
  • Литералы.

Представьте себе входные строки как болты, а шаблон — как набор разъемов для них (в соответствующем порядке).

Специальные символы

При проверке регулярных выражений нужно знать, как работают специальные символы:

  • Символ обратной косой черты \ может заменять другой специальный символ в регулярном выражении:
  • Точка и w — .

Совпадение со всеми символами, кроме новых строк. Если хотите проверить на соответствие точке, и только точке — , на соответствие буквам, цифрам и нижнему подчеркиванию — w

  • Квадратные скобки .

Совпадение с символами внутри скобок. Поддерживает диапазоны. Некоторые примеры:
o — соответствует любым a, b или c.
o прописные буквы.
o любая цифра.
o — соответствует любому буквенному символу в нижнем или верхнем регистре.
Опционально? Соответствие 0 или 1.
Звездочка *.

Звездочка обозначает 0 или более символов.

Соответствие 1 или более символам.

Фигурные скобки {}.

Минимальное и максимальное значения. Некоторые примеры синтаксиса регулярных выражений:
o {1,} не менее 1.
o {1,3} от 1 до 3.
o {1,64} от 1 до 64.

Добавим все это, чтобы получить регулярное выражение для адресов электронной почты:

/+@+(.+)*/i


Как это выглядит в PHP :

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Использование регулярного выражения для валидации

Задача : убедиться, что вводимые данные — это то, что мы ожидаем. Цель 1 : /[^w$.]/ Цель 2: /^{1,2}$/

Регулярные выражения подходят для поиска элементов, но вам нужно знать, что именно вы ищете.

Когда не стоит использовать регулярное выражение для проверки?

Многие случаи лучше обрабатывать с помощью функции PHP filter_var . Например, проверка адреса электронной почты должна выполняться с помощью встроенных фильтров PHP :

filter_var("[email protected]", FILTER_VALIDATE_EMAIL)

Валидация с помощью регулярных выражений

Регулярные выражения в конце строки используют анкоры:

^ — указывает начало строки.
$ — знак доллара, который указывает конец строки.

if (!preg_match("%^{1,2}$%", $_POST["subscription_frequency"])) { $isError = true; }

Исключенные классы символов

[^abc] — все, кроме a , b или c , включая новые строки.

Пример, который обеспечивает ввод только буквенно-цифровых символов, тире, точки, подчеркивания:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) { $isError = true; }

Поиск и замена

Наиболее распространенными функциями PCRE для выполнения поиска и замены являются preg_replace() и preg_replace_callback() . Но есть также preg_filter() и preg_replace_callback_array() , которые делают почти то же самое. Обратите внимание, что функция preg_replace_callback_array() доступна, начиная с PHP7 .

Заменить слова в списке

$subject = "I want to eat some apples."; echo preg_replace("/apple|banana|orange/", "fruit", $subject);

Результат

I want to eat some fruits.

Если в регулярном выражении есть подшаблоны (в круглых скобках ), можно заменить $N или N (где N является целым числом > = 1 ), это называется «обратная ссылка».

Перестановка двух чисел

$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);

Результат

Изменение форматирования даты

$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);

Результат

Простой пример замены URL-адреса в теге

$subject = "Please visit https://php.earth/doc for more articles."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject);

Результат

Please visit php.earth/doc for more articles.

Иногда нужно выполнить сложный поиск и замену, например, при фильтрации/проверке перед заменой. В этой ситуации может пригодиться preg_replace_callback() .

Приведенное в предыдущем примере регулярное выражение может заменить только URL-адреса , начинающиеся с http или https . Но теперь нам также нужно заменить URL-адреса, начинающиеся с www. Кто-то подумает, что можно просто изменить https? : // в подшаблоне. Например, на (?: Https? : // | www . ), Но это не будет работать в большинстве браузеров, потому что они будут интерпретировать www.domain как относительный путь.

Поэтому в конструкторе регулярных выражений перед заменой нужно выполнить некоторые действия, добавив http:// , если URL-адрес начинается с www .

function add_protocol_if_begins_with_www($matches) { $url = strtolower($matches) === "www." ? "http://" . $matches : $matches; return "{$matches}"; } $subject = "Please visit www.php.earth/doc for more articles."; echo preg_replace_callback("#(https?://|www.)([^s./]+(?>.[^s./]+)*[^s]*)#i", "add_protocol_if_begins_with_www", $subject);

Результат

При работе с текстами в любом современном языке программирования разработчики постоянно встречаются с задачами проверки введенных данных на соответствие нужному шаблону, поиска и замены тестовых фрагментов и прочими типовыми операциями по обработке символьной информации. Разработка собственных алгоритмов проверки приводит к потере времени, несовместимости программного кода и сложности в его развитии и модернизации.

Бурное развитие Интернета и языков WEB-разработки потребовало создания универсальных и компактных средств обработки текстовой информации при минимальном количестве требуемого для этого кода. Не является исключением и популярный среди начинающих и профессиональных разработчиков язык PHP. Регулярное выражение как язык текстовых шаблонов позволяет упростить задачи обработки текста и уменьшить программный код на десятки и сотни строк. Многие задачи вообще невозможно решить без него.

Регулярные выражения в PHP

Язык PHP содержит три механизма работы с регулярными выражениями - «ereg», «mb_ereg» и «preg». Наиболее распространенным является интерфейс «preg», функции которого обеспечивают доступ к библиотеке поддержки регулярных выражений PCRE, изначально разработанной для языка Perl, которая входит в комплект PHP. Preg-функции ищут в заданной текстовой строке совпадения, согласно определенному шаблону на языке регулярных выражений.

Основы синтаксиса

В рамках короткой статьи невозможно подробно описать весь синтаксис регулярных выражений, для этого существует специальная литература. Приведем только основные элементы для показа широких возможностей для разработчика и понимания примеров кода.

В формально определяется очень сложно, и поэтому упростим описание. Регулярное выражение представляет собой текстовую строку. Она состоит из выделенного разделителем шаблона и модификатора, указывающего на то, каким образом его обрабатывать. Возможно включение в шаблоны различных альтернатив и повторений.

Например, в выражении /\d{3}-\d{2}-\d{2}/m разделителем будет «/» , далее идет шаблон, а символ «m» будет модификатором.

Вся мощь регулярных выражений кодируется с помощью метасимволов. Основным метасимволом языка является обратный слэш - «\». Он меняет тип следующего за ним символа на противоположный (т. е. обычный символ превращается в метасимвол и наоборот). Другим важным метасимволом является прямая черта «|», задающая альтернативные варианты шаблона. Еще примеры метасимволов:

PHP, обрабатывая регулярные выражения, пробел рассматривает как отдельный значимый символ, поэтому выражения АБВГДЕ и АБВ ГДЕ являются разными.

Подшаблоны

В PHP регулярные подшаблоны выделяются круглыми скобками и иногда называются «подвыражениями». Выполняют следующие функции:

Выделение альтернатив . Например, шаблон жар(кое|птица|) совпадет со словами «жар», «жар-птица» и «жаркое» . А без скобок это будет только пустая строка, «птица» и «жаркое».

«Захватывающий» подшаблон. Это означает, что если в шаблоне совпала подстрока, то в качестве результата возвращаются все совпадения. Для наглядности приведем пример. Дано следующее регулярное выражение: победитель получает((золотую|позолоченный)(медаль|кубок)) - и строка для поиска совпадений: «победитель получает золотую медаль» . Кроме исходной фразы, в результате поиска будут выданы: «золотую медаль» , «медаль», «золотую» .

Операторы повторений (квадрификаторы)

При составлении регулярных выражений очень часто необходимо анализировать повторения чисел и символов. Это не является проблемой, если повторений не очень много. Но что делать, когда мы не знаем их точного числа? В таком случае необходимо использовать специальные метасимволы.

Для описания повторений применяются квадрификаторы - метасимволы для задания количества. Квадрификаторы бывают двух типов:

  • общие, заключенные в скобки;
  • сокращенные.

Общий квантификатор задет минимальное и максимальное количество разрешенных повторений элемента в виде двух чисел в фигурных скобках, например так: х{2,5}. Если максимальное количество повторений неизвестно, второй аргумент не указывается: х{2,}.

Сокращенные квантификаторы представляют собой символы для наиболее распространенных повторений во избежание лишней перегрузки синтаксиса. Обычно используются три сокращения:

1. * - ноль и больше повторений, что эквивалентно {0,}.

2. + - одно и более повторений, т. ,}.

3. ? - ноль или только одно повторение - {0,1}.

Примеры регулярных выражений

Для тех, кто изучает регулярные выражения, примеры - лучший учебник. Мы приведем несколько, которые показывают их широкие возможности при минимуме усилий. Все программные коды полностью совместимы с версиями PHP 4.x и выше. Для полного понимания синтаксиса и использования всех возможностей языка рекомендуем книгу Дж. Фридла «Регулярные выражения», где полностью рассматривается синтаксис и имеются примеры регулярных выражений не только на PHP, но и для языков Python, Perl, MySQL, Java, Ruby и C#.

Проверка корректности адреса E-mail

Задача. Существует Интернет-страница, на которой у посетителя запрашивается адрес email. Регулярное выражение должно проверять правильность полученного адреса перед отправкой сообщений. Проверка не дает гарантии, что указанный почтовый ящик реально существует и принимает письма. Но отсеять заведомо неправильные адреса она может.

Решение. Как и в любом языке программирования, на PHP регулярные выражения email-проверки адреса могут быть реализованы разными способами, и примеры в этой статье не являются окончательным и единственным вариантом. Поэтому в каждом случае мы будем приводить перечень требований, которые нужно учесть при программировании, а конкретная реализация полностью зависит от разработчика.

Итак, выражение, проверяющее правильность email, должно проверять следующие условия:

  • Наличие в исходной строке символа @ и отсутствие пробелов.
  • Доменная часть адреса, за символом @, содержит только допустимые символы для доменных имен. То же относится и к имени пользователя.
  • При проверке имени пользователя необходимо определить наличие специальных символов, таких как апостроф или Такие символы относятся к потенциально опасным и могут содержаться в таких видах нападений, как SQL-инъекции. Избегайте таких адресов.
  • Имена пользователя допускают наличие только одной точки, которая не может быть первым или последним символом в строке.
  • Доменное имя должно содержать не меньше двух и не более шести символов.
  • Пример, учитывающий все указанные условия, можно увидеть далее на рисунке.

    Проверка правильности адресов URL

    Задача. Проверить, является ли заданная текстовая строка допустимым Еще раз отметим, что регулярные выражения URL-проверки могут быть реализованы различными способами.

    Решение. Наш итоговый вариант выглядит следующим образом:

    /^(https?:\/\/)?([\da-z\.-]+)\.({2,6})([\/\w \.-]*)*\/?$/

    Теперь разберем его составляющие более подробно, используя рисунок.

    Проверяем номера кредитных карт

    Задача. Необходимо реализовать проверку правильности введенного номера пластиковой карты наиболее распространенных платежных систем. Рассмотрен вариант только для карт

    Решение. При создании выражения необходимо учитывать возможное наличие во введенном номере пробелов. Цифры номера на карте разделены на группы для упрощения чтения и диктовки. Поэтому вполне естественно, что человек может попытаться ввести номер таким образом (т. е. используя пробелы).

    Написать универсальное выражение, учитывающее возможные пробелы и дефисы, сложнее, чем просто отбросить все символы, кроме цифр. Поэтому в выражении рекомендуется использовать метасимвол /D, который удаляет все символы, кроме цифр.

    Теперь можно переходить непосредственно к проверке номера. Все компании, выпускающие кредитные карты, используют уникальный формат номера. В примере это используется, и клиенту нет необходимости вводить наименование компании - она определяется по номеру. Карты Visa всегда начинаются с 4 и имеют длину номера в 13 или 16 цифр. MasterCard начинается в диапазоне 51-55 с длиной номера 16. В итоге получаем такое выражение:

    Перед обработкой заказа можно провести дополнительную проверку последней цифры номера, которая вычисляется по алгоритму Луна.

    Проверка телефонных номеров

    Задача. Проверка корректности введенного телефонного номера.

    Решение. Количество цифр в стационарных и мобильных телефонных номерах значительно различается в зависимости от страны, поэтому универсально проверить, используя регулярные выражения, номер телефона на правильность невозможно. Но международные номера имеют строгий формат и отлично подходят для проверки по шаблону. Тем более что все больше национальных телефонных операторов стараются соответствовать единому стандарту. Структура номера следующая:

    +CCC.NNNNNNNNNNxEEEE, где:

    C - это код страны, состоящий из 1-3 цифр.

    N - номер длиной до 14 цифры.

    E - необязательное расширение.

    Плюс является обязательным элементом, а знак х присутствует только при необходимости расширения.

    В результате имеем следующее выражение:

    ^\+{1,3}\.{4,14}(?:x.+)?$

    Числа в диапазоне

    Задача. Необходимо обеспечить совпадение целого числа из определенного диапазона. Дополнительно необходимо, чтобы находили регулярные выражения только цифры из диапазона значений.

    Решение. Приведем несколько выражений для нескольких наиболее распространенных случаев:

    Поиск IP-адреса

    Задача. Необходимо определить, является ли заданная строка допустимым IP-адресом в формате IPv4 в диапазоне от 000.000.000.000-255.255.255.255.

    Решение. Как и в любой задаче на языке PHP, регулярное выражение имеет множество варинтов. Например, такое:

    Онлайн-проверка выражений

    Проверка регулярных выражений на правильность для начинающих программистов может быть затруднительной из-за сложности синтаксиса, отличающегося от «обычных» языков программирования. Для решения данной проблемы существует множество онлайн-тестеров выражений, позволяющих легко проверить правильность созданного шаблона на реальном тексте. Программист вводит выражение и данные для проверки и мгновенно видит результат обработки. Обычно здесь же присутствует справочный раздел, где подробно описываются регулярные выражения, примеры и отличия реализации для наиболее распостраненных языков программирования.

    Но полностью доверять результатам онлайн-сервисов не рекомендуется всем разработчикам, пользующимся PHP. Регулярное выражение, написанное и проверенное лично, повышает квалификацию и гарантирует отсутствие ошибок.

    Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон "Вася(.*)Пупкин" позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем "{6}" (если, например, от шести до восьми цифр, тогда "{6,8}"). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:

    Вместо набора символов может быть использовано обозначение любого символа - точка, может быть указан конкретный набор символов (поддерживаются последовательности - упоминавшиеся "0-9"). Может быть указано "кроме данного набора символов".

    Указатель количества символов в официальной документации по php называется "квантификатор". Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное значение - либо одно фиксированное ("{6}"), либо как числовой промежуток ("{6,8}"), так и абстрактное "любое число, в т.ч. 0" ("*"), "любое натуральное число" - от 1 до бесконечности ("+": "document+.txt"), "либо 0, либо 1" ("?"). По умолчанию квантификатор для данного набора символов равен единице ("document.txt").

    Для более гибкого поиска сочетаний эти связки "набор символов - квантификатор" можно объединять в метаструктуры.

    Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.

    Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая "там" строка. Из примеров: поисковый код, в котором из строки поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы (вернее, все пробелы сжимаются: " +" заменяется на один пробел). При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв. Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны. Например, сложную замену в большом тексте ими лучше не делать. Ведь, к примеру, комбинация "(.*)" в программном плане означает перебор всех символов текста. А если шаблон не привязан к началу или концу строки, то и сам шаблон "двигается" программой через весь текст, и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация "(.*)" означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста. Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций). Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше, но важен сам порядок цифр.

    Набор символов
    . точка любой символ
    [] квадратные скобки класс символов ("любое из"). Например
    [^] негативный класс символов ("любое кроме")
    - тире обозначение последовательности в классе символов ("" — цифры)
    \d Только цифры
    \D [^0-9] Кроме цифр
    \w Буквы и цифры
    \W [^a-z0-9] Кроме букв и цифр
    \s Пробельные символы: пробел, табуляция, перевод строки
    \S [^ ] Кроме пробельных символов
    | (одно|другое) На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: ...)

    Не пользуйтесь классом символов для обозначения всего лишь одного (вместо "+" вполне сойдет " +"). Не пишите в классе символов точку — это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).

    Квантификатор

    Квантификатором можно указать как конкретное значение, так и пределы. Если число заданных подпадает под пределы квантификатора, фрагмент выражения считается совпавшим с разбираемой строкой. Синтаксис:

    { }

    { , }

    Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: "{5,}" ("минимум 5"). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:

    На практике такие символы используются чаще, чем фигурные скобки.

    Якоря

    Эти символы должны стоять соответственно в самом начале и в самом конце строки.

    Жадность Вопросительный знак выступает еще и как минимизатор квантификатора:
    .*?

    Результат работы примера: Жадная версия: жирный текст [b]а тут - еще жирнее вернулись Ленивая версия: жирный текст [b]а тут - еще жирнее вернулись

    Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. После второго идут параметры:

    i регистронезависимый поиск
    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 будет содержать часть строки, соответствующую вхождению всего шаблона, $matches - часть строки, соответствующую первой подмаске, и так далее.

    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(), поскольку они выполнят эту задачу гораздо быстрее.

    Пример кода Пример кода Пример кода Результат работы примера:

    domain name is: сайт

    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 содержит массив полных вхождений шаблона, элемент $matches содержит массив вхождений первой подмаски, и так далее.

    Пример кода Результат работы примера: example: , this is a test example: , this is a test

    Как мы видим, $out содержит массив полных вхождений шаблона, а элемент $out содержит массив подстрок, содержащихся в тегах.

    PREG_SET_ORDER
    Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches содержит первый набор вхождений, элемент $matches содержит второй набор вхождений, и так далее.

    Пример кода Результат работы примера: example: , example: this is a test, this is a test

    В таком случае массив $matches содержит первый набор вхождений, а именно: элемент $matches содержит первое вхождение всего шаблона, элемент $matches содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches содержит второй набор вхождений, и так для каждого найденного набора.

    PREG_OFFSET_CAPTURE
    В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом - смещение.

    В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.

    Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

    Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.

    Пример кода Пример кода Результат работы примера: matched: bold text part 1: part 2: bold text part 3: matched:
    click me part 1: part 2: click me part 3: preg_quote

    Функция preg_quote - Экранирует символы в регулярных выражениях

    Синтаксис

    string preg_quote (string str [, string delimiter])

    Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

    В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ "/".

    В регулярных выражениях служебными считаются следующие символы: . \\ + * ? [ ^ ] $ () { } = ! < > | :

    Пример кода Пример кода Результат работы примера: This book is *very* 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.

    Пример кода

    Результатом работы этого примера будет:

    Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение subject, в противном случае будет возвращен исходный текст subject.

    Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.

    The bear black slow jumped over the lazy dog.

    Используя ksort(), получаем желаемый результат:

    The slow black bear jumped over the lazy dog.

    В случае, если параметр subject является массивом, поиск и замена по шаблону производятся для каждого из его элементов. Возвращаемый результат также будет массивом.

    В случае, если параметры pattern и replacement являются массивами, preg_replace() поочередно извлекает из обоих массивов по паре элементов и использует их для операции поиска и замены. Если массив replacement содержит больше элементов, чем pattern, вместо недостающих элементов для замены будут взяты пустые строки. В случае, если pattern является массивом, а replacement - строкой, по каждому элементу массива pattern будет осущесвтлен поиск и замена на pattern (шаблоном будут поочередно все элементы массива, в то время как строка замены остается фиксированной). Вариант, когда pattern является строкой, а replacement - массивом, не имеет смысла.

    Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

    Пример кода: Замена по нескольким шаблонам

    Этот пример выведет:

    $startDate = "5/27/1999";

    Пример кода: Использование модификатора /e Пример кода: Преобразует все HTML-теги к верхнему регистру preg_replace_callback

    Функция preg_replace_callback - Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова

    Синтаксис

    mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])

    Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback функцию, которой в качестве входящего параметра передается массив найденных вхождений. Ожидаемый результат - строка, которой будет произведена замена.

    Пример кода