Регулярные выражения php примеры preg match. Регулярные выражения в PHP. Пример регулярного выражения для получения изображений из html кода

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

  • PREG_PATTERN_ORDER;
  • PREG_SET_ORDER.

Сортировка по первому варианту группирует результаты поиска по номеру регулярного выражения (значение по умолчанию). Во втором случае результаты группируются по месту их нахождения в строке.

Символ - элемент шаблона

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

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

  • а - это конкретный элемент шаблона - символ.
  • a-z - это элемент шаблона, тоже один символ, но только со значением от a до z - вся латиница в нижнем регистре.
  • 0-9 - это одна цифра, причем любая, а вот 1-3 - только 1, 2 или 3.

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

Шаблон функции

PHP preg match all использует стандартный синтаксис регулярных выражений. обозначают один из символов, который в них указан:

  • только символы a, b, c.
  • [^ABC] все, кроме символов A, B, C.
  • \w и \W - текстовый или не текстовый символ.
  • \s и \S - пробельный или не пробельный символ.
  • \d и \D - цифра или не цифра.

Символы повторения обозначаются фигурными скобками - {n,m} и относятся к предыдущему символу.

  • n обозначает повторение "не менее";
  • m - повторение "не более".

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

Проще говоря, перечислив реальные символы, которые нужны, указав их нужные количества и учтя, что символ "^" соответствует началу, а "$" - концу строки, можно создавать простенькие шаблоны. Анализируя реальные отлаженные регулярные выражения от квалифицированных специалистов, можно обрести прочные знания для создания сложных применений preg match all. Арсенал PHP не ограничен только этими двумя функциями, но они чаще всего используются.

Простая практика

Шаблон для целого числа:

  • "/*/"

Тоже шаблон целого числа, но спереди может быть знак ("+", "-"), и спереди/сзади могут быть лишние пробелы:

  • /^[\s|\+|\-]{0,1}*/

Аналогично:

  • /^[\s|\+|\-]{0,1}*(\.)*/ - число с точкой.
  • /+@+\.{2,3}/ - вариант для распознавания e-mail.

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

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

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

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

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

Спецсимвол Описание
\ Символ экранирования. Пример: ‘/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 — подсчитывает количество элементов массива или количество свойств объекта.

1.6K

Регулярные выражения (сокращенно — 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);

Результат

В данной статье предоставлена подборка php regexp примеров. Очень хорошая и полезная коллекция примеров регулярных выражений (regular expressions). Все примеры регулярных выражений приемлемы для PHP. Пользуйтесь на здоровье!

Пример проверки доменного имени

Данный, php сниппет проверяет, является ли строка допустимым доменным именем.

?:.*)+):?(d+)?/?/i", $url)) { echo "Your url is ok."; } else { echo "Wrong url."; }

Пример подсветки слова в тексте

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

$text = "Sample sentence from KomunitasWeb, 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

Откройте файл search.php и найдите функцию the_title(). Замените ее следующей строкой:

Echo $title;

А теперь, перед замененной строкой вставьте этот код:

\0", $title); ?>

Сохраните ваш файл search.php и откройте style.css. Добавьте в него следующую строку:

Strong.search-excerpt { background: yellow; }

Пример получения изображений из HTML методом regexp

Данный кусок php кода использующий регулярные выражения, ищет все изображения и адрес url к ним.

$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; }

Поиск XHTML/XML тегов с определенными значениями атрибутов

Этот пример похож на предыдущую функцию, только вы можете значительно расширить поиск например найти

.

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; }

Поиск шестнадцатеричных значений цвета

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

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

Пример поиска title на заданной странице

Этот интересный пример PHP кода с regexp ищет и возвращает текст между тегами и .

Feof($fp)){ $page .= fgets($fp, 4096); } $titre = eregi("(.*)",$page,$regs); echo $regs; fclose($fp);

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

Большинство сайтов работают на известных серверах Apache. Если ваш сайт также работает на нем, то можно сделать парсинг лога сервера с помощью php regexp.

//Logs: Apache web server //Successful hits to HTML files only. Useful for counting the number of page views. "^((?#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 errors only "^((?#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)[^"]*)"$"

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

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

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

Замена текстовых смайликов на графические смайлики

Данный пример кода будет менять текстовый смайлик, на ваш графический. Интересный и полезный php сниппет.

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

Пример регулярного выражения для получения изображений из html кода

Стоит сказать, что данный php код используется в 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) { // Здесь вы можете обрабатывать ваши изображения // В данном примере они просто выведутся на монитор for ($i=0; $i < $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Надеюсь, вам была полезна подборка примеров php regexp. Если есть интересные дополнения или примеры регулярных выражений (php), пишите в комментариях.