Регулярные выражения – это очень полезный инструмент для разработчиков. С их помощью можно находить, определять или заменять текст, слова или любые другие символы. В сегодняшней статье собраны 15 наиболее полезных регулярных выражений, которые пригодятся любому веб-разработчику.
Введение в регулярные выражения
Многим начинающим разработчикам кажется, что регулярные выражения очень сложны для понимания и использования. На самом деле, все не так уж сложно, как может показаться. Прежде чем мы непосредственно перейдем к регулярным выражениям, с их полезным и универсальным кодом, давайте взглянем на основы:
Синтаксис регулярных выражений
Регулярное выражение | Означает |
foo | Строка “foo” |
^foo | Строка начинается с “foo” |
foo$ | Строка заканчивается на “foo” |
^foo$ | «foo» встречается в строке только один раз |
[abc] | a, b, или c |
[a-z] | любой символ в нижнем регистре |
[^A-Z] | любой символ, не находящийся в верхнем регистре |
(gif|jpg) | Означает как «gif” так и “jpeg” |
[a-z]+ | Один или более символов нижнего регистра |
[0-9.-] | Любая цифра, точка или знак минус |
^[a-zA-Z0-9_]{1,}$ | Любое слово, хотя бы одна буква, число или _ |
([wx])([yz]) | wy, wz, xy, или xz |
(^A-Za-z0-9) | Любой символ (не число и не буква) |
([A-Z]{3}|[0-9]{4}) | Означает три буквы или 4 цифры |
PHP-функции для регулярных выражений
Функция | Описание |
preg_match() | Функция preg_match() ищет строку по заданному шаблону, возвращает true, если строка находится и false, в остальных случаях |
preg_match_all() | Функция preg_match_all() находит все вхождения строки, заданной по шаблону |
preg_replace() | Функция preg_replace(), действует по тому же принципу, что и ereg_replace(), за исключением того, что регулярные выражения можно использовать как для задания шаблона поиска, так и для строки, на которую следует заменить, найденное значение. |
preg_split() | Функция preg_split(), действует так же как split(), за исключением того, что регулярное выражение можно использовать в качестве параметра для шаблона поиска. |
preg_grep() | Функция preg_grep() ищет все элементы входного массива, возвращая все элементы, соответствующие шаблону регулярного выражения. |
preg_quote() | Экранирует символы регулярного выражения |
Проверка доменного имени
Проверяем, является ли строка правильным доменным именем
$url = "http://komunitasweb.com/"; if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(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", '<span style="background:#5fc9f6">1</span>', $text); echo $text;
Подсветка результатов поиска в WordPress блоге
Как уже говорилось в предыдущем примере, этот пример кода, удобно использовать в выдаче поисковых результатов и есть отличный способ внедрить эту функцию в wordpress-блог.
Откройте ваш файл search.php, и найдите функцию the_title(). Замените ее следующим кодом:
echo $title;
Теперь, выше этой строки, добавьте этот код:
<?php $title = get_the_title(); $keys= explode(" ",$s); $title = preg_replace('/('.implode('|', $keys) .')/iu', '<strong class="search-excerpt">\0</strong>', $title); ?>
Сохраните файл search.php, и откройте style.css. Добавьте следующую строку:
strong.search-excerpt { background: yellow; }
Получение всех картинок из HTML-документа
Если вам когда-нибудь требовалось получить все картинки с веб-страницы, этот код должен быть Вы легко сможете создать загрузчик изображений с помощью возможностей cURL
$images = array(); preg_match_all('/(img|src)=("|\')[^"\'>]+/i', $data, $media); unset($data); $data = preg_replace('/(img|src)("|\'|="|=\')(.*)/i', "$3", $media[0]); 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. Повторюсь, эту функцию очень удобно использовать вместе с cURL.
function get_tag( $tag, $xml ) { $tag = preg_quote($tag); preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}', $xml, $matches, PREG_PATTERN_ORDER); return $matches[1]; }
Поиск XHTML/XML тэгов с определенным значением атрибута
Эта функция очень похожа на предыдущую, за исключением того, что вы можете задать тегу нужный атрибут. Например, вы легко сможете найти <div id=”header”>.
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[3]; }
Поиск шестнадцатеричных значений цветов
Еще один полезный инструмент для веб-разработчика! Он позволяет вам находить/проверять шестнадцатеричные значение цвета.
$string = "#555555"; if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) { echo "example 6 successful."; }
Поиск заголовка статьи
Этот фрагмент кода найдет и выведет на экран текст, находящийся внутри тэгов <title></title>, на html-странице.
$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp) ){ $page .= fgets($fp, 4096); } $titre = eregi("<title>(.*)</title>",$page,$regs); echo $regs[1]; fclose($fp);
Парсинг логов Apache
Большинство сайтов запущено на всем известном веб-сервере Apache. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?
//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/[0-9.]+"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/[0-9.]+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$'
Замена двойных кавычек “умными” кавычками
Если вы любитель типографики, вам понравится это регулярное выражение, заменяющее обычные двойные кавычки, на “умные кавычки”. Похожее регулярное выражение используется в wordpress в контенте страницы.
preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);
Комплексная проверка пароля
Это регулярное выражение будет следить за тем, чтобы в текстовое поле было введено не менее шести символов, цифры, дефисы и подчеркивания.
Текстовое поле должно содержать как минимум один символ верхнего регистра, один нижнего регистра и одну цифру.
'A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z'
WordPress: Использование регулярного выражения для получения картинок из записи
Поскольку многие из вас являются пользователями WordPress, вам возможно пригодится код, который позволяет получить все картинки, из текста статьи, и вывести их.
Для того, чтобы использовать этот код, просто вставьте его в любой файл вашей темы.
<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <?php $szPostContent = $post->post_content; $szSearchPattern = '~<img [^>]* />~'; // 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[0]); 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[0][$i]; }; }; endwhile; endif; ?>
Генерация автоматических смайлов
Другая функция, используемая в wordpress – позволяет автоматически заменять символы смайлов на картинку смайла.
$texte='A text with a smiley :-)'; echo str_replace(':-)','<img src="smileys/souriant.png">',$texte);
Перевод статьи “15 PHP regular expressions for web developers”, автор Jean-Baptiste Jung
Отличная статья!
Оченно пользительно. Благодарствуем!
Последнее как бы совсем не регексп.
Шпаргалка очень полезная! Спасибо хозяйке блога!
И позвольте поделиться несколькими ссылками, которые помогут(мне помогли)
в изучении/написании/отладке регулярок.
Большая, подробная статья о регулярных выражениях. Написана для тех, кто о них узнал только сегодня. Написана простым, понятным языком, изобирует примерами с подробными комментариями.
h**p://www.phpclub.ru/detail/article/regexp_1
h**p://www.phpclub.ru/detail/article/regexp_2
Две статьи:
Введение в регулярные выражения. Синтаксис.
Регулярные выражения в PHP
h**p://www.codenet.ru/cat/Languages/PHP/Regular-Expressions/
RegExr — онлайн редактор и тестер регулярных выражений
h**p://gskinner.com/RegExr/
Лучшая программа для работы с регулярками. Создание, тестирование.
Имеет огромную библиотеку регулярок на все случаи жизни. С её помощью можно создать регулярное выражение даже не обладая глубокими познаниями в regular expressions. Имеет встроеный дебагер.
Очень рекомендую!
h**p://www.regexbuddy.com/
Поделись инструкцией. Я не понимаю англицкий
Очень полезная шпаргалка! надо ее распечатать и держать под рукой…а лучше постер на стену)) А то постоянно что-нибудь да забудешь
Где я могу об этом прочитать?
http://ru.wikipedia.org/wiki/Regex
Статья полезная, только не все примеры верны. Например про доменное имя. Согласно правилам имя может содержать только цифры, латиницу и дефис. При это первый и последний символ не может быть дефисом. На доменную зону накладывается ограничение от 2 до 4 символов латиницы. Имя дмена как правило не может состоять только из одного символа, обычно от двух или трех. На полное имя — зона, домены, под домены вместе с точками, также органичение — не более 63 символов.
Поэтому правильно проверять домен (не URL) так:
if (strlen($domain < 64) && preg_match('/^([0-9a-z]([0-9a-z\-])*[0-9a-z]\.)+[a-z]{2,4}$/i', $domain))
{
echo ("domain OK");
}
else
{
echo ("domain wrong");
}
юзай
function checkurl($url) {
// режем левые символы и крайние пробелы
$url=trim(pregtrim($url));
// если пусто — выход
if (strlen($url)==0) return 1;
//проверяем УРЛ на правильность
if (!preg_match(«~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}».
«(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|».
«org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?».
«!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&».
«?+=\~/-]*)?(?:#[^ ‘\»&]*)?$~i»,$url,$ok))
return -1; // если не правильно — выход
// если нет протокала — добавить
if (!strstr($url,»://»)) $url=»http://».$url;
// заменить протокол на нижний регистр: hTtP -> http
$url=preg_replace(«~^[a-z]+~ie»,»strtolower(‘\’)»,$url);
return $url;
}
Забыли ; поставить в Поиск XHTML/XML тэгов с определенным значением атрибута в строке 11
Не поможете разобраться со следующей задачей, а то никак не могу найти решение, за одно думаю мне это поможет чтоб понять
задача:
есть вариации 3×256/3×100,3 или 3x256x100,3 или 3×256 или или 3×256/100,3
как разобрать одним выражением?
Пробовал разные варианты, но обязательно, где-то косяк вылезет.
заранее спасибо
Скрипт для XHTML/XML работает только для строки, если внутри тега будет много строчный текст — регулярное выражение не сработает. Т.к «.» — работает только для строки. Для того чтобы регулярка отработала, нужно добавить модификаторы
m — Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строкекста.
s По умолчанию метасимвол ‘.’ не включает в свое определение символ перевода строки. Указание этого модификатора снимает это ограничение.
спасибо, отличная статья, нужная
Хотел написать скрипт на регулярных выражениях, чтобы определял, какой текст в noindex, а какой нормально индексируется. В общем, написал, но если встречается иерархическая структура noindex (а бывает и такое), то возникают проблемы. Например (тут 1о — первый открывающий тег, 1з — первый закрывающий и т.д.): текст 1о текст 2о текст 2з текст 3о текст 3з текст 1з текст индексируется 4о текст 4з. Тут скрипт определяет в noindex отрезок [1о — 4з], если паттерн жадный. Если же не жадный, то тогда в noindex: [1о — 2з], [3о — 3з] и [4о — 4з] (но текст между 2з и 3о тоже не должен индексироваться). В общем, жадный забирает слишком много, нежадный — слишком мало. Как найти золотую середину?
разбор хтмл тегов — увы задача не такая тривиальная как кажется.. т.к. в одном случае рег. выражение сработает, а в другом нет..
к примеру #]*>#
выдаст совсем не то, если в значении атрибута будет >
можно было бы написать рег. выражение типа
#<([^\s/]+)((?:\s+[^\»‘>]+(?:\»[^\»]*\»|'[^’]*’|[^>]*))*|/)># (взято из tinyMCE)
но оно тоже не всегда работает! хотя для 99% случаев подходит =)
Да очень поезная статейка, тоько скрипт почему то не работает — Использование регулярного выражения для получения картинок из записи — Parse error on line 25 и Получение всех картинок из HTML-документа ошибку выдает почему то — on line 9 ?
Только что наткнулся на ошибку при использовании функции для поиска картинок в тексте, просто некоторые фотоаппараты сохраняют картинку с расширением myimage.JPG (верхний регистр ) и предложенная функция не находит картинки
Вот что я поменял
if ((strcasecmp($info['extension'], 'jpg')) == 0 ||
(strcasecmp($info['extension'], 'jpeg')) == 0 ||
(strcasecmp($info['extension'], 'gif')) == 0 ||
(strcasecmp($info['extension'], 'png')) == 0 )
И о чудо у меня всё заработало !!!!! :) :) :)
Приветствую. Не подскажите как решить такую задачу?
Имеется html страница, сохраненная в текстовом формате, с текстом и разными сылками, там есть ссылка — http://www.google.com/recaptcha/api/image?c=03AHJ_VusbLjn_T5zg4xAmgb1lyzEZ3q2AjTn0nLjv4mD4GKISkLukUHHT2cIQdbJyzZUDg7tOJgIAR2nm_t8p9sVjm7Rb7aApLqNuPauN0eSTMeTbrgTq4ScIVajh5y2BpT1xWaT5-6c8YnEkOKqXca73eBw0-Fg
как извечь и записать первую такую ссыку (там их несколько) в чистом виде, в другой txt файл используя как признак — часть этой ссылки — recaptcha/api/image
Нужен универсальный скрипт, что бы можно было вытаскивать другие ссылки используя как признак их часть, самому подставляя эти признаки в шаблон.
Не ломалку ли для капчи пишешь? Чтобы спамить потом? Не помогайте, коллеги…
Всем привет!
Получилось отловить картинки и добавить им тег alt, но на выходе не срабатывает форматирование(используется визуальный редактор), помогите, подскажите, пож, в чем проблема.
Код:
$pattern = «#]*src=([\»‘])?([^\s]+)\\1[^>]*\/?>#is»;
$preg = array(
$pattern => », //перед img поставила \ (слеш) , его нет по идее
);
$body = preg_replace(array_keys($preg), array_values($preg), $body);
return $body;
Т.е. нет обтекания текстом картинки.
Спасибо.
Лучшая программа для работы с регулярками. Создание, тестирование.
Очень полезная статья, шпаргалка программистам
довольно хорошо представлена подборка, взял себе на заметку некоторые полезные вещи.
Хоть бы первоисточник указал!
А вы внимательно прочитали текст статьи, прежде чем писать этот комментарий?
$images = array();
preg_match_all(‘/(img|src)=(«|’)[^»‘>]+/i’, $data, $media);
unset($data);
$data=preg_replace(‘/(img|src)(«|’|=»|=’)(.*)/i’,»$3»,$media[0]);
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);
}
}
Автор… сам то проверял свои регулярки… или просто содрал не думая?
Автор (если вы обо мне), понадеялся на автора оригинального поста и сам не проверял, но благодаря вашему ценному, хотя и малоинформативному замечанию, обнаружил неэкранированный апостроф. Спасибо за комментарий.
Автор, хоть исправьте для тех, кто в будущем заходит на сайт:
. (точка) — означает любой символ, если же вам нужна именно «точка», то ее надо слэшить — \.
(d+) — это я так понимаю одна или несколько цифр, а на самом деле будет искать букву d, тоже надо слэш — (\d+)
да и обычный слэш / тоже желательно слэшить — \/
Это я только проверку url посмотрел… кстати в имени домена в начале может и не быть никаких http и пр. этот вариант вами не учтен.
обязательно распечатаю и буду держать эти заметки на рабочем столе, Автор молодец что не поленился всё это искать
Недавно пришлось писать скрипт поиска в тексте российских мобильных номеров. Готовые решения не подошли потому, что неизвестен формат ввода этих номеров. Мой заказчик(хозяин риэлторской компании) просил помочь выявить менеджеров, которые постят на сайт предложения и переводят стрелки на себя, указывая свой, а не корпоративный номер телефона.
Посидев пару часиков родил вот такое решение:
Уверенно парсит номера вот такого вида:
8 910 82 570 26
+79261234567
89261234567
79261234567
+7 926 123 45 67
8(926)123-45-67
8 (926)123-45-67
8-(926)123-45-67
9261234567
79261234567
89261234567
8-926-123-45-67
8 927 1234 234
8 927 12 12 888
8 927 12 555 12
8 927 123 8 123
Ой, код пропал из предыдущего сообщения… Я его в тег code обернул, а он пропал…
Вот он:
preg_match_all( ‘/(8|7|\+7){0,1}[- \\\\(]{0,}([9][0-9]{2})[- \\\\)]{0,}(([0-9]{2}[- ]{0,}[0-9]{2}[- ]{0,}[0-9]{3})|([0-9]{3}[- ]{0,}[0-9]{2}[- ]{0,}[0-9]{2})|([0-9]{3}[- ]{0,}[0-9]{1}[- ]{0,}[0-9]{3})|([0-9]{2}[- ]{0,}[0-9]{3}[- ]{0,}[0-9]{2}))/’, $text, $regs );
Скрипт не рабочий
$url = «http://komunitasweb.com/»;
if (preg_match(‘/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i’, $url)) {
echo «Your url is ok.»;
} else {
echo «Wrong url.»;
}
PHP Warning: preg_match(): Unknown modifier ‘/’ in /home/a11012/litechat/test/1.php on line…
Почему никто не пользуется площадкой для тестрования регулярных выражений? Можно сохранять без регистрации и т.п.
Реально классная штука, вот например выбор картинок из html документа http://pcreonline.com/vybor-vsex-kartinok-iz-html-dokumenta/
А из чего следует, что никто не пользуется?
А что такое umis в выборе картинок ?
Как ей пользоваться Где инструкция
Документации пока нет, есть небольшое описание здесь http://mod-site.net/ru/info/onlayn-ploschadka-dlya-testirovaniya-i-hraneniya-regulya_184705.shtml
Здрасте!
Я попробвал вашу регулярку для проверки доменного имена и у меня выскочила ошибка:
Unknown modifier ‘?’
но регулярка выполнилась успешно.
В чем причина ошибки?
Народ плиз подскажите регулярное выражение для поиска ширины картинки width=»550″ или бывает width=»100%»
При помощи регулярных выражений выделите в файлах сохраненных страниц page01, page02 и page03 записи о товарах. Создайте на основе полученных сведений массив вида:
Array (
Array (
’Title’ => ’наименование товара’,
’Link’ => ’ссылка на товар’,
’Cost’ => ’стоимость товара’
),
Array (
’Title’ => ’…’,
’Link’ => ’…’,
’Cost’ => ’…’
),
…
)
Исключите дубликаты товаров с одинаковой ссылкой. Выведите на экран все товары в порядке возрастания стоимости.
помогите пожалуйста с кодом.
Согласен
Спасибо очень помогли!
Не хватает обратных слешей и фигурных скобок в «Удаление повторяющ(ихся|ейся)[\w\s\)\(]+». В таком виде они бесполезны.
Автору БОЛЬШОЕ спасибо!
В примере для поиска XML/HTML тэгов, кажется, кавычка потерялась: ‘{]*>(.*?).’}’
Во всяком случае, их нечётное количество.
А для чего нужны фигурные скобки в данном случае?
возможно будет полезно использовать ещё и модификаторы http://ru2.php.net/manual/en/reference.pcre.pattern.modifiers.php в регулярках
Мне на первых этапах помог сервис генерации простых регулярных выражений для новичков.
в «Подсветка слова в тексте» регулярка с ошибками
там вот так
preg_replace("/b(regex)b/i", '1', $text);
а должно быть
preg_replace("/(regex)/", '\1', $text);