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

Опубликовано 2011.08.07

Смотри также конструктор регулярных выражений Регулярные выражения – это очень интересный инструмент для программистов. С их помощью можно находить, определять или заменять текст, слова или любые другие символы. В сегодняшней статье собраны 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() Экранирует символы регулярного выражения
И несколько примеров:

Проверка доменного имени

Проверяем, является ли строка правильным доменным именем

  1. $url = "http://chyvakoff.px6.ru/";
  2. if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i', $url)) {
  3. echo "Your url is ok.";
  4. } else {
  5. echo "Wrong url.";
  6. }

Подсветка слова в тексте

Это очень полезное регулярное выражение, с его помощью вы можете найти нужное слово и подсветить его. Особенно полезно для отображения результатов поиска.

  1. $text = "Sample sentence from KomunitasWeb. Now we learn regex. 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";
  2. $text = preg_replace("/b(regex)b/i", '<span style="background:#5fc9f6">1</span>', $text);
  3. echo $text;

Подсветка результатов поиска в WordPress блоге

Как уже говорилось в предыдущем примере, этот пример кода, удобно использовать в выдаче поисковых результатов и есть отличный способ внедрить эту функцию в wordpress-блог.

Откройте ваш файл search.php, и найдите функцию the_title(). Замените ее следующим кодом:

  1. echo $title;

Теперь, выше этой строки, добавьте этот код:

  1. $title = get_the_title();
  2. $keys= explode(" ",$s);
  3. $title = preg_replace('/('.implode('|', $keys) .')/iu',
  4. '<strong class="search-excerpt">\0</strong>',
  5. $title);

Сохраните файл search.php, и откройте style.css. Добавьте следующую строку:

  1. strong.search-excerpt { background: yellow; }

Получение всех картинок из HTML-документа

Если вам когда-нибудь требовалось получить все картинки с веб-страницы, этот код должен быть Вы легко сможете создать загрузчик изображений с помощью возможностей cURL

  1. $images = array();
  2. preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media);
  3. unset($data);
  4. $data=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$media[0]);
  5. foreach($data as $url)
  6. {
  7. $info = pathinfo($url);
  8. if (isset($info['extension']))
  9. {
  10. if (($info['extension'] == 'jpg') ||
  11. ($info['extension'] == 'jpeg') ||
  12. ($info['extension'] == 'gif') ||
  13. ($info['extension'] == 'png'))
  14. array_push($images, $url);
  15. }
  16. }

Удаление повторяющихся слов (не чувствителен к регистру)

Во время печатания, часто повторяются слова? Поможет это регулярное выражение.

  1. $text = preg_replace("/s(w+s)1/i", "$1", $text);

Удаление повторяющейся пунктуации

То же самое, только для пунктуации. Попрощайтесь с двойными запятыми.

  1. $text = preg_replace("/.+/i", ".", $text);

Поиск XML/HTML тэгов

Эта простая функция, принимает два аргумента. Первый – это тэг, который вам нужно найти, и второй – это переменная, содержащая XML или HTML. Повторюсь, эту функцию очень удобно использовать вместе с cURL.

  1. function get_tag( $tag, $xml ) {
  2. $tag = preg_quote($tag);
  3. preg_match_all('{<'.$tag.'[^>]*>(.*?).'}',
  4. $xml,
  5. $matches,
  6. PREG_PATTERN_ORDER);
  7.  
  8. return $matches[1];
  9. }
  10. </'.$tag.'[^>

Поиск XHTML/XML тэгов с определенным значением атрибута

Эта функция очень похожа на предыдущую, за исключением того, что вы можете задать тегу нужный атрибут. Например, вы легко сможете найти <div id=”header”>.

  1. function get_tag( $attr, $value, $xml, $tag=null ) {
  2. if( is_null($tag) )
  3. $tag = '\w+';
  4. else
  5. $tag = preg_quote($tag);
  6.  
  7. $attr = preg_quote($attr);
  8. $value = preg_quote($value);
  9.  
  10. $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*".
  11. "(['\"])$value\\2[^>]*>(.*?)<\/\\1>/"
  12.  
  13. preg_match_all($tag_regex,
  14. $xml,
  15. $matches,
  16. PREG_PATTERN_ORDER);
  17.  
  18. return $matches[3];
  19. }
  20. </\/\\1></(".$tag.")[^>

Поиск шестнадцатеричных значений цветов

Еще один полезный инструмент для веб-разработчика! Он позволяет вам находить/проверять шестнадцатеричные значение цвета.

  1. $string = "#555555";
  2. if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) {
  3. echo "example 6 successful.";
  4. }

Поиск заголовка статьи

Этот фрагмент кода найдет и выведет на экран текст, находящийся внутри тэгов <title></title>, на html-странице.

  1. $fp = fopen("http://www.catswhocode.com/blog","r");
  2. while (!feof($fp) ){
  3. $page .= fgets($fp, 4096);
  4. }
  5.  
  6. $titre = eregi("<title>(.*)</title>",$page,$regs);
  7. echo $regs[1];
  8. fclose($fp);

Парсинг логов Apache

Большинство сайтов запущено на всем известном веб-сервере Apache. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?

  1. //Logs: Apache web server
  2. //Successful hits to HTML files only. Useful for counting the number of page views.
  3. '^((?#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)[^"]*)"$'
  4.  
  5. //Logs: Apache web server
  6. //404 errors only
  7. '^((?#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 в контенте страницы.

  1. preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);

Комплексная проверка пароля

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

Текстовое поле должно содержать как минимум один символ верхнего регистра, один нижнего регистра и одну цифру.

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

Для того, чтобы использовать этот код, просто вставьте его в любой файл вашей темы.

  1. if (have_posts()) :
  2. while (have_posts()) : the_post();
  3.  
  4.  
  5. $szPostContent = $post->post_content;
  6. $szSearchPattern = '~<img [^ />]* />~';
  7.  
  8. // Run preg_match_all to grab all the images and save the results in $aPics
  9. preg_match_all( $szSearchPattern, $szPostContent, $aPics );
  10.  
  11. // Check to see if we have at least 1 image
  12. $iNumberOfPics = count($aPics[0]);
  13.  
  14. if ( $iNumberOfPics > 0 ) {
  15. // Now here you would do whatever you need to do with the images
  16. // For this example the images are just displayed
  17. for ( $i=0; $i < $iNumberOfPics ; $i++ ) {
  18. echo $aPics[0][$i];
  19. };
  20. };
  21.  
  22. endwhile;
  23. endif;

Генерация автоматических смайлов

Другая функция, используемая в wordpress – позволяет автоматически заменять символы смайлов на картинку смайла.

  1. $texte='A text with a smiley :-)';
  2. echo str_replace(':-)','<img src="smileys/souriant.png" />',$texte);