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

13-02-27 Php PHP, RegExp 1

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

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

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

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

Хочешь получать статьи на почту?

Подпишись на обновления!
* Ваш email не будет разглашен/продан. Вы сможете отписаться в любое время.

1 Комментарий

  1. Сергей says:

    Странно, а у меня проверка пароля по данной регулярке не заработала.
    Заработала с такой вот: (?!^[0-9]*$)(?!^[a-zA-Z]*$)(?!^[a-z0-9]*$)(?!^[A-Z0-9]*$)^([a-zA-Z0-9]{6,})$

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *