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

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

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

Результат

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

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

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

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

mixed preg_match (string pattern, string subject [, array &matches [, int flags [, int offset]]])

Ищет в заданном тексте subject совпадения с шаблоном pattern

В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches будет содержать часть строки, соответствующую вхождению всего шаблона, $matches - часть строки, соответствующую первой подмаске, и так далее.

flags может принимать следующие значения:

PREG_OFFSET_CAPTURE

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

Дополнительный параметр flags доступен начиная с PHP 4.3.0.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Дополнительный параметр offset доступен начиная с PHP 4.3.3.

Замечание: Использование параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match_all() , поскольку шаблон pattern может содержать такие условия как ^ , $ или (? . Сравните:

В то время как этот пример

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all() . Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.

Подсказка: Не используйте функцию preg_match() , если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr() , поскольку они выполнят эту задачу гораздо быстрее.


Пример 2. Поиск слова "web" в тексте

/*
Специальная последовательность \b в шаблоне означает границу слова,
следовательно, только изолированное вхождение слова "web" будет соответствовать
маске, в отличие от "webbing" или "cobweb".
*/
if (preg_match ("/\bweb\b/i" , "PHP is the web scripting language of choice." )) {
echo "Вхождение найдено." ;
} else {
echo "Вхождение не найдено." ;
}preg_match ("/\bweb\b/i" , "PHP is the website scripting language of choice." )) {
echo "Вхождение найдено." ;
} else {
echo "Вхождение не найдено." ;
}
?>

Описание функции:

Функция preg_replace ищет совпадения регулярного выражения (pattern ) с данными в строке (subject) и заменяет их на данные находящиеся в replacement .

Аргумент

Описание

pattern

Обязательный аргумент. Регулярное выражение (шаблон поиска)

string, array

replacement

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

Также для ссылок можно использовать конструкцию вида \${1} равнозначную \$1, это конструкция используется если после ссылки идет сразу цифра (\${1}1).

string, array
subject Обязательный аргумент. Строка или массив с данными которые будут заменены. string, array
limit

Необязательный аргумент. Максимально количество замен. По умолчанию равно -1 (не ограниченно)

int
count

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

int

Функция preg_replace() может использоваться с модификатором / e. При наличии этого модификатора параметр replacement интерпретируется как PHP-код и затем используется для замены.

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

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

Достаточно хорошо описание регулярных выражений приводится на wikipedia.org , основные моменты применения регулярных выражений также описаны

Примеры:

Пример 1:

В этом примере заменяем все цифры помещенные в скобки на звездочки.

Пример 2:

В этом примере заменяем строку соответствующую всему шаблону, данными соответствующими первой подмаске по ссылке \$1. Другими словами "have 3 apples", соответствующие "/(\w+) (\d+) (\w+)/", будет заменено на "have", соответствующее (\w+).

Пример 3:

В этом примере показано, что произойдет если в качестве pattern и replacement использовать массивы.

Пример 4:

В этом примере показано, что произойдет если в качестве pattern, replacement и subject использовать массивы.

Пример 5:

В этом примере показано использование модификатора / e, т.е когда replacement интерпретируется как php код. Ниже показано преобразование символов из нижнего в верхний регистр.

Пример 6:

В этом примере показано использование аргумента count. Здесь результат будет равен 2, так произошло две замены.

Вверх