• Регулярные выражения (шаблоны). Регулярные выражения Регулярные выражения php или

    Давно хотел разобраться с регулярными выражениями. Хотя «разобраться» — громко сказано. Чтобы постичь великое искусство и стать повелителем регулярных выражений, нужно постоянно с ними иметь дело. Мало изучить синтаксис, спецсимволы и модификаторы, — нужно уметь ими пользоваться. А умение пользоваться приходит с опытом.

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

    Таблица спецсимволов

    Спецсимвол Описание
    \ Символ экранирования. Пример: ‘/seo\/smo/’ — соответствует строке, в которой есть seo/smo.
    ^ Символ начала данных. Пример: ‘/^seo/’ — соответствует строке, которая начинается словом seo.
    $ Символ конца данных. Пример: ‘/блог$/’ — соответствует строке, которая заканчивается словом блог.
    . Любой символ, кроме перевода строки. Пример: ‘/seo.ult/’ — соответствует строке seopult, seo9ult, seo@ult и т.д.
    Внутри этих скобок перечисляются символы, любой из которых может стоять на данном месте, но только один. Пример: ‘/seoult/’ — под соответствие попадут только строки, содержащие seopult, seokult или seomult.
    | Или. Пример ниже.
    () Подмаска.
    ? Одно или ноль вхождений предшествующего символа или подмаски.
    * Любое количество вхождений предшествующего символа или подмаски. В том числе и ноль.
    + Одно или более вхождений.
    Пример: ‘/se+(op|om)?.*t/’ — буква s, затем одна или несколько букв e, после этого сочетание op или om может встречаться один раз, а может и ни разу, потом любое количество любых символов и буква t.
    {a,b} Количество вхождений предшествующего символа или подмаски от a до b. Пример: {0,} — то же самое, что *, {0,1} — то же, что?, {3,5} — 3, 4 или 5 повторений.

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

    1) Предыдущие и последующие выражения.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // найти слово в котором после Box идёт ing. Если слово найдено, функция вернёт true, если нет - false. $pattern1 = "/Box(?=ing)/" ; preg_match ($pattern1 , "Box Day" ) ; // false preg_match ($pattern1 , "Boxing Day" ) ; // true // найти слово в котором после box не идёт ing. Если слово найдено, функция вернёт true, если нет - false. $pattern2 = "/box(?!ing)/" ; preg_match ($pattern2 , "Box for iPhone and iPad" ) ; // true preg_match ($pattern2 , "What is boxing day?" ) ; // false preg_match ($pattern2 , "css-moz-box-shadow" ) ; // true // найти слово в котором перед ing не идёт box. Если слово найдено, функция вернёт true, если нет - false. $pattern3 = "/(?

    [^<]+?~","seo блог",$text); echo $text; ?>

    3) Получить и вывести значение Alexa Rank заданного сайта.

    1 2 3 4 5 6 7 8 9 "#
    (.*?)
    #si" , file_get_contents ("http://www.alexa.com/siteinfo/{$url} " ) , $a ) ; return trim (str_replace ("," , "" , strip_tags ($a [ 1 ] ) ) ) ; } $alexa = alexa($url ) ; echo $alexa ; ?>

    (.*?)

    #si", file_get_contents("http://www.alexa.com/siteinfo/{$url}"), $a); return trim(str_replace(",","",strip_tags($a))); } $alexa = alexa($url); echo $alexa; ?>

    4) Получить и вывести title страницы.

    1 2 3 4 5 (.*)<\/title>/s" , $str , $m ) ; echo $m [ 1 ] ; ?>

    (.*)<\/title>/s", $str, $m); echo $m; ?>

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/" , "" , $content ) ; // замена символов перевода строки и табуляции на пробел $content = preg_replace ("/{2,}/" , " " , $content ) ; // замена более 2х пробелов на один preg_match_all ("/]*href=(?:"|\" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU" , $content , $links ) ; // сбор ссылок if (sizeof ($links [ 1 ] ) > 0 ) // если ссылки найдены { $out = array () ; // массив внешних ссылок foreach ($links [ 1 ] as $v ) { if (preg_match ("/http:\/\/(www\.){0,1}" . $domain . "/i" , $v ) ) // отсеиваем внутренние ссылки { continue ; } if (preg_match ("/(http:|https:)?\/\/(www\.){0,1}(.*)/i" , $v ) ) // внешняя ссылка { $out = $v ; } } return $out ; } return array () ; } $domain = "сайт" ; $content = file_get_contents ("http://сайт/" ) ; $getoutlinks = getoutlinks($content , $domain ) ; for ($i = 0 ; $i <= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
    " ; } ?>

    ]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU", $content, $links); // сбор ссылок if (sizeof($links) > 0) // если ссылки найдены { $out = array(); // массив внешних ссылок foreach ($links as $v) { if (preg_match("/http:\/\/(www\.){0,1}".$domain."/i", $v)) // отсеиваем внутренние ссылки { continue; } if (preg_match("/(http:|https:)?\/\/(www\.){0,1}(..com/"); $getoutlinks = getoutlinks($content, $domain); for ($i = 0; $i <= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
    "; } ?>

    где:
    preg_replace — выполняет поиск и замену по регулярному выражению.
    preg_match — выполняет проверку на соответствие регулярному выражению.
    preg_match_all — отыскивает все совпадения, в то время как preg_match — только первое.
    file_get_contents — получить содержимое файла в виде одной строки.
    trim — удаляет пробелы в начале и конце строки.
    str_replace — заменяет строку поиска на строку замены.
    strip_tags — удаляет html и php тэги из строки.
    sizeof — получает количество элементов в переменной.
    count — подсчитывает количество элементов массива или количество свойств объекта.

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

    Правила составление шаблона (pattern)

    Границы шаблона должны обозначаться определенными символами, часто используют "/ ", но я предпочитаю использовать "# " потому, что от обилия прямых/обратных слешей может в глазах зарябить, а "решетки" обычно больше нигде не используются. Итак: "#ТутТелоРегулярногоВыражения# "

    Внутри регулярного выражения используются скобки - это подвыражения, с которыми можно производить манипуляции, пример:

    #^/catalog/(+)/(+)\.html.*#

    Это выражение предназначено для получения параметров в строке URL . В начале строки идет спецсимвол "^ " - это означает начало строки. Далее идет "/catalog/ " - тут нет спецсимволов, это просто текст, который должен содержатся в строке. Затем встретили круглые скобки, т.е. дошли до первого подвыражения. В квадратных скобках обозначаются множество символов, которые могут быть в строке в этом месте. Знак "- " означает перечисление. Знак "\ " экранирует специальные символы. Таким образом, в первом подвыражении у нас могут идти БОЛЬШИЕ и маленькие буквы латинского алфавита, цифры от 0 до 9, знак подчеркивания, тире и точка. Тире и точка - это спецсимволы, но здесь они экранированы, поэтому здесь это просто символы. После квадратных скобок идет знак "+ " - это значит предыдущий символ (а у нас это множество символов заданное в квадратных скобках) может идти 1 или больше раз. Затем идет "/ " - это просто символ, и аналогичное второе подвыражение. Затем идет "\.html ", что означает текст ".html ". А затем спец символы ".* " точка означает любой символ, а звездочка любое количество предыдущего символа. Т.е. после ".html " может идти все что угодно.

    Указание количества, квантификаторы

    Выше мы уже рассмотрели такие символы, указывающие количество предыдущих символов, как + и * . Приведем все возможности указания количества:

    Спецсимволы

    Для некоторых групп символов есть специальные сокращения:

    "Жадность"

    Рассмотрим понятие жадности регулярного выражения. Например есть строка:

    #()#

    Читаем: подвыражение:

    Вроди все верно, подвыражение подходит под:

    Но оно также подходит под:

    Его то мы и получим, т.к. регулярные выражения по умолчанию "жадные". Снять жадность можно с помощью модификатора "U ", вот так:

    #()#U

    Модификаторы

    После регулярного выражения могут идти модификаторы: "#ТутТелоРегулярногоВыражения#ТутМодификаторы " Виды модификаторов:

    i Включает режим case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
    m Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы "^" и "$" указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
    s По умолчанию метасимвол ". " не включает в свое определение символ перевода строки. Указание этого модификатора снимает это ограничение.
    U Снимает жадность регулярного выражения
    u Включает работу регулярных выражений с кириллицей в UTF-8 , иначе работает не корректно.

    php Функции для работы с регулярными выражениями

    preg_replace

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

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

    Каждое значение может быть строкой или массивом, в случае, если $subject массив - возвращается массив, иначе строка

    preg_split

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

    Preg_split (string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]]);

    Возвращает массив, состоящий из подстрок заданной строки subject , которая разбита по границам, соответствующим шаблону pattern .

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

    Бурное развитие Интернета и языков 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, должно проверять следующие условия:

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

    Пример, учитывающий все указанные условия, можно увидеть далее на рисунке.

    Проверка правильности адресов 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. Регулярное выражение, написанное и проверенное лично, повышает квалификацию и гарантирует отсутствие ошибок.

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

    Начнем с одной народной программистской мудрости:

    Некоторые люди, сталкиваясь с проблемой, думают: «Ага, я умный, я решу её с помощью регулярных выражений». Теперь у них две проблемы.

    Примеры шаблонов

    Начнем с пары простых примеров. Первое выражение на картинке ниже ищет последовательность из 3 букв, где первая буква это «к», вторая - любая русская буква и третья - это «т» без учета регистра (например, «кот» или «КОТ» подходит под этот шаблон). Второе выражение ищет в тексте время в формате 12:34 .

    Любое выражение начинается с символа-ограничителя (delimiter по англ.). В качестве него обычно используют символ / , но можно использовать и другие символы, не имеющие специального назначения в регулярках, например, ~ , # или @ . Альтернативные разделители используют, если в выражении может встречаться символ / . Затем идет сам шаблон строки, которую мы ищем, за ним второй ограничитель и в конце может идти одна или несколько букв-флагов. Они задают дополнительные опции при поиске текста. Вот примеры флагов:

    • i - говорит, что поиск должен вестись без учета регистра букв (по умолчанию регистр учитывается)
    • u - говорит, что выражение и текст, по которому идет поиск, исплоьзуют кодировку utf-8, а не только латинские буквы. Без него поиск русских (и любых других нелатинских) символов может работать некорректно, потому стоит ставить его всегда.

    Сам шаблон состоит из обычных символов и специальных конструкций. Ну например, буква «к» в регулярках обозначает саму себя, а вот символы значат «в этом месте может быть любая цифра от 0 до 5». Вот полный список специальных символов (в мануале php их называют метасимволы), а все остальные символы в регулярке - обычные:

    Ниже мы разберем значение каждого из этих символов (а также объясним почему буква «ё» вынесена отдельно в первом выражении), а пока попробуем применить наши регулярки к тексту и посмотреть, что выйдет. В php есть специальная функция preg_match($regexp, $text, $match) , которая принимает на вход регулярку, текст и пустой массив. Она проверяет, есть ли в тексте подстрока, соответствующая данному шаблону и возвращает 0 , если нет, или 1 , если она есть. А в переданный массив в элемент с индексом 0 кладется первое найденное совпадение с регуляркой. Напишем простую программу, применяющую регулярные выражения к разным строкам:

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

    Скобки в регулярных выражениях

    Давай повторим, что обозначают разные виды скобок:

    • Фигурные скобки a{1,5} задают число повторений предыдущего символа - в этом примере выражение ищет от 1 до 5 идущих подряд букв «a»
    • Квадратные скобки означают «один любой из этих символов», в данном случае - буквы a, b, c, x, y, z или цифра от 0 до 5. Внутри квадратных скобок не работают другие спецсимволы вроде | или * - они обозначают обычный символ. Если в квадратных скобках в начале стоит символ ^ то смысл меняется на противоположный: «любой один символ, кроме указанных» - например [^a-c] значит «один любой символ, кроме a, b или c».
    • Круглые скобки группируют символы и выражения. Например в выражении abc+ знак «плюс» относится только к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если поставить скобки a(bc)+ то квантифиактор плюс относится уже к последовательности bc и выражение ищет слова abc, abcbc, abcbcbc

    Примечание: в квадратных скобках можно указывать диапазоны символов, но помни, что русская буква ё идет отдельно от алфавита и чтобы написать «любая русская буква», надо писать [а-яё] .

    Бекслеши

    Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил, что бекслеш везде пишут по-разному. Где-то пишут один бекслеш: \d , а здесь в примерах он повторен 2 раза: \\d . Почему?

    Язык регулярных выражений требует писать бекслеш один раз. Однако в строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое значение: мануал про строки . Ну например, если написать $x = "\$"; то PHP воспримет это как специальную комбинацию и вставит в строку только символ $ (и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы вставить в строку последовательность \$ , мы должны удвоить бекслеш и записать код в виде $x = "\\$"; .

    По этой причине в некоторых случаях (там, где последовательность символов имеет специальный смысл в PHP) мы обязаны удваивать бекслеш:

    • Чтобы написать в регулярке \$ , мы пишем в коде "\\$"
    • Чтобы написать в регулярке \\ , мы удваиваем каждый бекслеш и пишем "\\\\"
    • Чтобы написать в регулярке бекслеш и цифру (\1), бекслеш надо удвоить: "\\1"

    В остальных случаях один или два бекслеша дадут один и тот же результат: "\\d" и "\d" вставят в строку пару символов \d - в первом случае 2 бекслеша это последовательность для вставки бекслеша, во втором случае специальной последовательности нет и символы вставятся как есть. Проверить, какие символы вставятся в строку, и что увидит движок регулярных выражений, можно с помощью echo: echo "\$"; . Да, сложно, а что поделать?

    Специальные конструкции в регулярках

    • \d ищет одну любую цифру, \D - один любой символ, кроме цифры
    • \w соответствует одной любой букве (любого алфавита), цифре или знаку подчеркивания _ . \W соответствует любому символу, кроме буквы, цифры, знака подчеркивания.

    Также, есть удобное условие для указания на границу слова: \b . Эта конструкция обозначает, что с одной стороны от нее должен стоять символ, являющийся буквой/цифрой/знаком подчеркивания (\w), а с другой стороны - не являющийся. Ну, например, мы хотим найти в тексте слово «кот». Если мы напишем регулярку /кот/ui , то она найдет последовательность этих букв в любом месте - например, внутри слова «скотина». Это явно не то, что мы хотели. Если же мы добавим условие границы слова в регулярку: /\bкот\b/ui , то теперь искаться будет только отдельно стоящее слово «кот».

    Мануал

    • Синтаксис регулярных выражений в PHP , подробное описание

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

    Введение в регулярные выражения

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

    Функции для работы с регулярными выражениями в PHP

    Проверка домена

    Проверка на правильное доменное имя.

    $url = "http://example.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) { echo "Ok."; } else { echo "Wrong url."; }

    Подсветка слов в тексте

    Очень полезное регулярное выражение для . Пригодится для поиска.

    $text = "Sample sentence, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor"; $text = preg_replace("/b(regex)b/i", "1", $text); echo $text;

    Подсветка результатов поиска в WordPress

    Как уже было сказано, предыдущий пример очень полезен при . Применим его к WordPress. Откройте файл search.php, найдите функцию the_title(). Замените её следующим:

    Echo $title;

    Теперь, перед этой строкой вставьте код:

    \0", $title); ?>

    Откройте файл style.css . Добавьте в него строку:

    Strong.search-excerpt { background: yellow; }

    Получить все изображения из HTML документа

    Если вам когда-нибудь понадобиться найти все изображения на HTML странице, вам пригодится следующий код. С его помощью можно легко создать загрузчик изображений, используя .

    $images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data as $url) { $info = pathinfo($url); if (isset($info["extension"])) { if (($info["extension"] == "jpg") || ($info["extension"] == "jpeg") || ($info["extension"] == "gif") || ($info["extension"] == "png")) array_push($images, $url); } }

    Удаление повторяющихся слов (не зависимо от регистра)

    $text = preg_replace("/s(w+s)1/i", "$1", $text);

    Удаление повторяющихся знаков препинания

    Похоже на предыдущее, только удаляет знаки препинания.

    $text = preg_replace("/.+/i", ".", $text);

    Нахождение XML/HTML тега

    Простая функция, которая принимает два аргумента: тег, который необходимо найти, и строка, содержащая XML или HTML.

    Function get_tag($tag, $xml) { $tag = preg_quote($tag); preg_match_all("{<".$tag."[^>]*>(.*?)."}", $xml, $matches, PREG_PATTERN_ORDER); return $matches;

    Нахождение XML/HTML тега с определенным значением атрибута

    Функция похожа на предыдущую, но появляется возможность указать атрибут тега. Например:

    .

    Function get_tag($attr, $value, $xml, $tag=null) { if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($attr); $value = preg_quote($value); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; }

    Нахождение шестнадцатеричных кодов цвета

    Функция позволяет находить или проверять правильность шестнадцатеричных кодов цвета.

    $string = "#555555"; if (preg_match("/^#(?:(?:{3}){1,2})$/i", $string)) { echo "example 6 successful."; }

    Нахождение заголовка страницы

    Данный код найдет и выведет на экран текст между тегами </i> и <i> HTML страницы.

    $fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp)){ $page .= fgets($fp, 4096); } $titre = eregi("(.*)",$page,$regs); echo $regs; fclose($fp);

    Парсинг логов Apache

    Многие сайты работают на веб-сервере Apache. Если ваш сайт тоже работает на тако сервере, то следующие регулярки могут пригодиться.

    //Logs: Apache web server // Успешные доступы к html файлам. Полезно для подсчета показов страниц. "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$" //Logs: Apache web server //404 ошибки "^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$" }

    Замена двойных кавычек на фигурные

    preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $text);

    Проверка сложности пароля

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

    "A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)[-_a-zA-Z0-9]{6,}z"

    WordPress: Получение изображений поста с помощью регулярного выражения

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

    post_content; $szSearchPattern = "~]* />~"; // Run preg_match_all to grab all the images and save the results in $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Check to see if we have at least 1 image $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) { // Now here you would do whatever you need to do with the images // For this example the images are just displayed for ($i=0; $i < $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

    Преобразование смайлов в картинки

    Эта функция также есть в WordPress, она позволяет автоматически заменить текстовые смайлы на картинки.

    $texte="A text with a smiley:-)"; echo str_replace(":-)","",$texte);