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

12 июня 2013 | Автор: | Категория: Полезно знать

Давно хотел разобраться с регулярными выражениями. Хотя «разобраться» — громко сказано. Чтобы постичь великое искусство и стать повелителем регулярных выражений, нужно постоянно с ними иметь дело. Мало изучить синтаксис, спецсимволы и модификаторы, — нужно уметь ими пользоваться. А умение пользоваться приходит с опытом.

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

Таблица спецсимволов

Спецсимвол Описание
\ Символ экранирования. Пример: ‘/seo\/smo/’ — соответствует строке, в которой есть seo/smo.
^ Символ начала данных. Пример: ‘/^seo/’ — соответствует строке, которая начинается словом seo.
$ Символ конца данных. Пример: ‘/блог$/’ — соответствует строке, которая заканчивается словом блог.
. Любой символ, кроме перевода строки. Пример: ‘/seo.ult/’ — соответствует строке seopult, seo9ult, seo@ult и т.д.
[] Внутри этих скобок перечисляются символы, любой из которых может стоять на данном месте, но только один. Пример: ‘/seo[pkm]ult/’ — под соответствие попадут только строки, содержащие seopult, seokult или seomult.
| Или. Пример ниже.
() Подмаска.
? Одно или ноль вхождений предшествующего символа или подмаски.
* Любое количество вхождений предшествующего символа или подмаски. В том числе и ноль.
+ Одно или более вхождений.
Пример: ‘/se+(op|om)?.*t/’ — буква s, затем одна или несколько букв e, после этого сочетание op или om может встречаться один раз, а может и ни разу, потом любое количество любых символов и буква t.
{a,b} Количество вхождений предшествующего символа или подмаски от a до b. Пример: {0,} — то же самое, что *, {0,1} — то же, что ?, {3,5} — 3, 4 или 5 повторений.


Простые примеры php скриптов с использованием регулярных выражений:

1) Предыдущие и последующие выражения.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
// найти слово в котором после Box идёт ing. Если слово найдено, функция вернёт true, если нет - false.
$pattern1 = '/Box(?=ing)/';
 
preg_match($pattern1,'Box Day'); // false
preg_match($pattern1,'Boxing Day'); // true
 
// найти слово в котором после box не идёт ing. Если слово найдено, функция вернёт true, если нет - false.
$pattern2 = '/box(?!ing)/';
 
preg_match($pattern2,'Box for iPhone and iPad'); // true
preg_match($pattern2,'What is boxing day?'); // false
preg_match($pattern2,'css-moz-box-shadow'); // true
 
// найти слово в котором перед ing не идёт box. Если слово найдено, функция вернёт true, если нет - false.
$pattern3 = '/(?<!box)ing/';
 
preg_match($pattern3,'contesting a ticket'); // true
preg_match($pattern3,'What is boxing day?'); // false
?>

2) Заменить определенную ссылку в тексте.

1
2
3
4
5
<?php
$text = 'Посетив <a href="http://seogrot.com/">Seo блог</a> я узнал для себя много нового.';
$text=preg_replace("~<a href=\"http://seogrot\.com/\">[^<]+?</a>~",'seo блог',$text);
echo $text;
?>

3) Получить и вывести значение Alexa Rank заданного сайта.

1
2
3
4
5
6
7
8
9
<?php
$url='http://seogrot.com/';
function alexa($url) {
preg_match('#<div class="data .+?">(.*?)</div>#si', file_get_contents("http://www.alexa.com/siteinfo/{$url}"), $a);
return trim(str_replace(",","",strip_tags($a[1])));
}
$alexa = alexa($url);
echo $alexa;
?>

4) Получить и вывести title страницы.

1
2
3
4
5
<?php
$str = file_get_contents('http://moz.com/blog');
preg_match('/<title>(.*)<\/title>/s', $str, $m);
echo $m[1];
?>

5) Получить и вывести внешние ссылки.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
function getoutlinks($content, $domain)
{
    $content = preg_replace("/[\n\r\t]/", '', $content); // замена символов перевода строки и табуляции на пробел
    $content = preg_replace("/[ ]{2,}/", ' ', $content); // замена более 2х пробелов на один
 
    preg_match_all("/<a[^<>]*href=(?:'|\")(.*)(?:'|\")[^<>]*>(.*)<\/a>/iU", $content, $links); // сбор ссылок               
 
    if (sizeof($links[1]) > 0) // если ссылки найдены
    {
        $out = array(); // массив внешних ссылок
 
        foreach ($links[1] as $v)
        {
            if (preg_match("/http:\/\/(www\.){0,1}".$domain."/i", $v)) // отсеиваем внутренние ссылки
            {
                continue;
            }
 
            if (preg_match("/(http:|https:)?\/\/(www\.){0,1}(.*)/i", $v)) // внешняя ссылка 
            {                                                                                
                $out[] = $v;                                                                                        
            }
        }                        
 
        return $out;
    }                
 
    return array();
}
$domain = 'seogrot.com';
$content = file_get_contents('http://seogrot.com/');
$getoutlinks = getoutlinks($content, $domain);
  for ($i = 0; $i <= count($getoutlinks); $i++)
  {
    echo $getoutlinks[$i]."<br>";
  } 
?>

где:
preg_replace — выполняет поиск и замену по регулярному выражению.
preg_match — выполняет проверку на соответствие регулярному выражению.
preg_match_all — отыскивает все совпадения, в то время как preg_match — только первое.
file_get_contents — получить содержимое файла в виде одной строки.
trim — удаляет пробелы в начале и конце строки.
str_replace — заменяет строку поиска на строку замены.
strip_tags — удаляет html и php тэги из строки.
sizeof — получает количество элементов в переменной.
count — подсчитывает количество элементов массива или количество свойств объекта.

Комментарии к "Регулярные выражения в PHP с примерами"

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

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