Полезные регулярки.

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

Примеры шаблонов

Выражение Совпадает
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}) Совпадает три буквы или четыре цифры

Функции для работы

Функция Описание
preg_match() Ищет совпадение по шаблону
preg_match_all() Ищет все совпадения по шаблону
preg_replace() Замена совпадения по шаблону
preg_split() Разбивка на несколько частей по шаблону
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", '1', $text);
echo $text;

Подстветить результаты поиска в wordpress

Небольшой хак подсветки искомых слов для блога. Открываем search.php и ищет там строку:

echo $title;

И меняем ее на:

	$title 	= get_the_title();
	$keys= explode(" ",$s);
	$title 	= preg_replace('/('.implode('|', $keys) .')/iu',
		'\0',
		$title);

И добавляем в css

strong.search-excerpt { background: yellow; }

Получаем все картинки со страницы

$url = "http://komunitasweb.com/";
$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

function get_tag( $tag, $xml ) {
  $tag = preg_quote($tag);
  preg_match_all('{<'.$tag.'[^>]*>(.*?).'}',
                   $xml,
                   $matches,
                   PREG_PATTERN_ORDER);

  return $matches[1];
}

Ищем совпадения по тегам — XML/HTML

function get_tag( $tag, $xml ) {
  $tag = preg_quote($tag);
  preg_match_all('{<'.$tag.'[^>]*>(.*?).'}',
                   $xml,
                   $matches,
                   PREG_PATTERN_ORDER);

  return $matches[1];
}

Ищем совпадения по тегам с установленным атрибутом — XML/HTML

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

Находим заголовок страницы

$fp = fopen("http://www.catswhocode.com/blog","r");
while (!feof($fp) ){
    $page .= fgets($fp, 4096);
}

$titre = eregi("",$page,$regs);
echo $regs[1];
fclose($fp);

Распарсиваем логи апача

//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)[^"]*)"$'

Заменяем двойные кавычки на безопасный аналог

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

Например, можно вывести нужную картинку как превью или показать их в архивах.


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[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;
?>

ВСтавляем смайлики в текст

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

Источник

5.00 avg. rating (90% score) - 1 vote

14 комментариев

  • Полезные регулярки….

    Thank you for submitting this cool story — Trackback from progg.ru…

  • Надо вот нижеслед. строчку поправить
    ^foo Наичнается с foo

    • mheart, поправил, спасибо за очепятку

  • ^[a-zA-Z0-9_]{1,}$
    лучше так — ^[a-zA-Z0-9_]+$

  • Класная подборка,
    я для таких дела использую http://vitalik.info/notik/
    но база уже выросла и получается не оч удобно + долговато открывается, вот шас думаю куда бы это всё переместить

  • Спасибо, отличные примеры, буду использовать.

  • Спасибо за подбор… буду их по мере использовать

  • Регулярки действительно полезные! Спасибо, пользуюсь!

  • В закладки.
    зы. очепятка: foo$ — Кончается НА foo

  • А как решить такую задачу?
    Имеется txt файл с сохраненным текстом и ссылками, там есть ссылка на изображение — http://www.google.com/recaptcha/api/image?c=03AHJ_VusbLjn_T5zg4xAmgb1ly-zEZ-3q2AjTn0nLjv4m
    D4GKISkLukUHHT2cIQdbJyzZUDg-7tOJgIAR2nm_t8p9sVjm7Rb7aApLqNuPauN0eSTMeTbrgTq4ScIVajh5y2BpT1
    xWaT5-6c8YnEkOKqXca73eBw0-Fg но изначально известно только, что она содержит recaptcha/api/image
    как извечь и записать первую такую ссыку в другой txt файл испоьзуя как признак часть этой ссылки — recaptcha/api/image
    Нужно универсальное регулярное выражение, что бы можно было вытаскивать другие ссылки используя как признак их часть, подставляя эти признаки в регулярное выражение.

    • slava34
      Примерно вот так — /recaptcha\/api\/image\?c=(.*?)$/

      P.S. Отпишись, подойдет если.

  • Спасибо Alex Volkov, а за сколько возьметесь написать скриптик полностью?

    • Черкани поподробнее что надо сделать на me@alexvolkov.ru

  • не подскажите как написать регулярку для ссылок!Что бы некие слова заменялись на ссылки!
    Вот я написал

    $text = preg_replace(«/(?<=\W|^)".$ke."(?![^)(?=\W|$)/m»,’&nbsp’.$ke.’&nbsp‘, $text, $am, $count);

    но почему то он вместо слов заменил пробелы на пробелы!

    &nbsp&nbsp

css.php