Несколько полезных регулярных выражений для веб-разработки.
Регулярные выражения — очень полезный инструмент для разработчиков. Регулярные выражения позволяют проверять правильность текста, искать и изменять его.
В этой статье собраны некоторые очень полезные выражения, с которыми часто приходится работать.
Введение в регулярные выражения
При первом знакомстве с регулярными выражениями может показаться, что их сложно понять и применять. На самом деле все проще, чем кажется. Перед тем как приступить к рассмотрению сложных примеров, разберем основы:
Регулярное выражение | Подходящая строка |
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,}$ | Любое слово длинной не менее 1 буквы, число или _ |
([wx])([yz]) | wy, wz, xy, или xz |
[^A-Za-z0-9] | Любой символ (не цифра, и не буква) |
([A-Z]{3}|[0-9]{4}) | Три буквы или 4 цифры |
Функции для работы с регулярными выражениями в PHP
Функция | Описание |
---|---|
preg_match() | Ищет совпадения с шаблоном в заданной строке. Возвращает количество совпадений. |
preg_match_all() | Ищет все совпадения с шаблоном в строе и помещает их в массив. |
preg_replace() | Выполняет поиск совпадений с шаблоном в строке и заменяет их. |
preg_split() | Разбивает строку по регулярному выражению. |
preg_grep() | Возвращает массив, состоящий из элементов входящего массива, которые соответствуют заданному шаблону. |
preg_quote() | Добавляет обратный слэш перед каждым служебным символом. |
Проверка домена
Проверка на правильное доменное имя.
$url = "http://example.com/"; if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(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", '<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>\0</strong>', $title); ?>
Откройте файл style.css. Добавьте в него строку:
strong.search-excerpt { background: yellow; }
Получить все изображения из HTML документа
Если вам когда-нибудь понадобиться найти все изображения на 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.
function get_tag( $tag, $xml ) { $tag = preg_quote($tag); preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}', $xml, $matches, PREG_PATTERN_ORDER); return $matches[1];
Нахождение XML/HTML тега с определенным значением атрибута
Функция похожа на предыдущую, но появляется возможность указать атрибут тега. Например: <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. Если ваш сайт тоже работает на тако сервере, то следующие регулярки могут пригодиться.
//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/[0-9.]+"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/[0-9.]+"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-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);
Странно, а у меня проверка пароля по данной регулярке не заработала.
Заработала с такой вот: (?!^[0-9]*$)(?!^[a-zA-Z]*$)(?!^[a-z0-9]*$)(?!^[A-Z0-9]*$)^([a-zA-Z0-9]{6,})$