Content downloader регулярные выражения


Символьные обозначения:

«.» — любой символ, кроме переноса строки(n);

«d» — цифровой символ, т.е. любая цифра от 0 до 9;

«[0-9]» — цифровой диапазон — отличается от d тем, что в данном виде есть возможность указать не любой цифровой символ, а используя диапазоны, например [1-3], который найдет только цифры 1, 2 и 3;

«D» — не цифровой символ. Т.е. все символы — буквенные и пробелы, кроме цифр;

«s» -все пробельные символы, которые могут включать в себя:

— пробел « »;

— новая страница «f»;

— возврат каретки «r»;

— новая строка «n»;

— знак табуляции «t»;

— знак вертикальной табуляции «v»;

«S» — не пробельный символ, т.е. все буквы, цифры и знаки. Всё, что не перечислено выше, как пробельные символы.

«w» — буквенный или цифровой символ или знак подчёркивания.


«W» — любой символ, кроме буквенного или цифрового символа или знака подчёркивания.

Обозначения границ:

^ — начало строки;

$ — конец строки;

b — граница слова;

B — не граница слова.

К примеру, нам нужно проверить, содержит ли строка слово “Красный”, прописав в конструкторе «красный», мы можем получить так же и другие слова, в которые входит данное слово, такие как “прекрасный” и т.д. Что бы этого не происходило, необходимо прописать bкрасныйb — таким образом, все слова, которые могут быть похожи на искомое учитываться не будут.

Не граница слова, соответственно, работает наоборот. К примеру, мы знаем, что слово должно заканчиваться на “жили”, но само слово “жили” нам не нужно, тогда мы прописываем Bжили и получаем список слов с нужным нам окончанием — дорожили, выжили и т.д.

Обозначения количества совпадений (Квантификаторы):

{5} — ровно 5;

{1,5} — от 1 до 5 включительно;

{1,} — от 1 и более;

? — ноль или одно, так же соответствует {0,1};

* — ноль или более, так же соответствует {0,};

+ — Одно или более, так же соответствует {1,}.

Квантификаторы устанавливаются после символов, число повторений которых необходимо задать.


Возьмём для примера точку, которая обозначает любой символ, и составим регулярное выражение, которому будет соответствовать любая последовательность из 4 символов. Результат будет выглядеть таким образом: .{4}

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

с.{2}л — такое регулярное выражение найдёт такие слова, как стол, стул и т.д., но ему так же будет соответствовать строка, имеющая в середине пробелы, цифры и прочее.

[​IMG]

Для того, чтобы указать, что внутри будут только буквы, необходимо прописать таким образом:

[​IMG]

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

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

[a-zA-Z1-5абв] — данная последовательность обозначает любую английскую букву в верхнем и нижнем регистре, числа от 1 до 5 включительно, а так же русские буквы а, б и в.


Регулярное выражение будет иметь такой вид:

Мы обозначаем, что после буквы “с” идут 2 любых символа, указанных в квадратных скобках и данная последовательность найдёт слова стол и стул, но ему так же будут соответствовать последовательности букв “суул”, “сутл” и прочие.

Модификаторы:

(?i) — включает нечувствительность выражения к регистру символов;
(?-i) — выключает нечувствительность выражения к регистру символов.

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

Пример использования:
[​IMG]
[​IMG]

Так же бывают случаи, когда в одном месте регистр для нас не важен, а в другом важен.

Пример использования:
[​IMG]


Данное регулярное выражение найдёт строку “Test, TEST”, т.к. у первой фразы включена нечувствительность к регистру и она находит все совпадения, но не найдёт “TEST, Test”, т.к. во второй фразе должно быть точное совпадение по регистру.

Модификаторы многострочного поиска:

(?m) — включает многострочный поиск

(?-m) — отключает многострочный поиск

Для того чтобы найти все строки, начинающиеся с не пробельного символа, подойдёт такое регулярное выражение:

Символы, которые должны экранироваться, для того, чтобы они учитывались в регулярном выражении как текст, а не как часть регулярного выражения (метасимволы):

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

К примеру, если в тексте у вас должен находиться знак вопроса, он обозначается как ?

zennolab.com

Content Downloader и A-Parser

Обзор основных возможностей. В сегодняшнем обзоре сравним Content Downloader и A-Parser и попробуем дать оценку двум популярным продуктам в области парсинга.
Согласно определения разработчиков, Content Downloader — программа, предназначенная для парсинга любой информации с любых сайтов. Программа может применяться для:


  • парсинга товаров интернет-магазина в таблицу CSV;
  • парсинга статей с картинками и файлами в txt или htm форматы;
  • парсинга телефонных номеров, e-mail адресов или любой другой контактной информации;
  • парсинга скрытой информации, доступной после авторизации;
  • парсинга любых частей кода WEB-документов и их вывод в нужном для вас формате;
  • парсинга XML-карт сайтов;

Кроме того, в парсере есть возможность задавать дополнительные параметры:

  • многопоточность;
  • авторизация через передачу cookies из IE или через post-запрос;
  • возможность задать cookies;
  • возможность задавать user agent;
  • загрузка файлов и картинок на ваш FTP-сервер при парсинге контента
  • возможность отправки данных в базу MySQL при парсинге
  • возможность подключения собственных PHP-скриптов для обработки данных при парсинге контента;

Что касается возможностей A-Parser выделим главные:

  • предоставляет как готовые решение так и возможность создания собственных пресетов;
  • возможность обработки собранных данных;
  • экспортировать результаты в разные форматы;
  • существует каталог парсеров и пресетов, который постоянно обновляется. В каталоге собраны индивидуальные решения по нестандартным задачам;
  • возможность создавать свои собственные парсеры на основе регулярных выражений или Xpath;
  • используя язык JavaScript есть возможность создания собственных сколько угодно сложных парсеров;
  • существует поддержка API, позволяет легко встроить A-Parser в бизнес процессы

Все возможности, которыми обладает A-Parser, можно найти на официальном ресурсе продукта по этому адресу https://a-parser.com.

Сравнение основных возможностей.
На первый взгляд, базовые возможности обоих программ очень похожи по определению. Например в части основного функционала и возможности задавать дополнительные параметры практически ничем не отличаются. К таким характеристикам можно отнести практически все пункты рассмотреные выше. Но реализация функционала как базового так и дополнительного имеет принципиальные отличия, которые определяют индивидуальность каждого решения в подходах к выполнению заданий.
В отличие от Content Downloader, в A-Parser уже есть набор готовых решений которые решают большую часть заданий связанных с парсингом популярных ресурсов. Наличие каталога парсеров и пресетов постоянно пополняется новыми примерами, которые поступаю от пользователей.
В части настройки и создания собственных парсеров, стоит отметить наличие намного большего количества параметров которые можно задавать через интерфейс в A-Parser, тогда как в Content Downloader задавать большую часть параметров нет возможности. К таким параметрам относятся:


  • возможность одновременного использования нескольких парсеров;
  • возможность манипулировать параметрами запроса, через использования «конструктора запросов»;
  • переопределения параметров парсера в каждом конкретном случаи;
  • манипулировать представлением результатов через «конструктор результатов»;
  • возможность индивидуального форматирования результатов, через «шаблонизатор» который встроен в парсер;

Что касается возможности создания новых парсеров, подключения сторонних программ, интеграции парсера в свои собственные системы — здесь A-Parser имеет целый ряд возможностей.
В A-Parser, для создания собственных парсеров, существует возможность использовать язык программирования java script. Используя встроенные классы и методы можно создать собственный парсер по каким угодно критериям. Спарсить можно абсолютно любой ресур, используя как язык java script можно как отдельно так и с подключением отдельных, готовых парсеров — для получения результатов в собственный парсер. Это намного расширяет возможности по созданию собственных решений.
Что касается интеграции A-Parser в собственные бизнес-процесы, здесь предусмотрена поддержка API. Для обмена информацией A-Parser со своей собственно созданной системой, можно использовать один с популярных языков программирования (Perl, Python, PHP, Node.js). Ограничений нет абсолютно никаких, схема взаимодействия простая:

  1. передаем в парсер входные данные
  2. парсер собирает информацию
  3. получаем ответ и используем его для своих целей

Вывод. Проанализировав два програмных комплекса A-Parser и Content Downloader следует отметить высокий уровень обоих решений. Сочетания разного функционала и возможностей по интеграции делают их довольно универсальными инструментами в области решения задач по парсингу. Подробный анализ характеристик, все же позволяет выделить некоторые преимущества A-Parser по сравнению с конкурентом. Преимущества касаются более гибких возможностей в части создания парсеров, настройки запросов и результатов, использования дополнительных возможностей с использованием языка программирования java script, а также интеграции парсера в бизнес процессы с использованием API. Наличие большого количества готовых решений и существования каталога с пресетамы который постоянно обновляется — делает A-Parser более полезным для обычного пользователя.

a-parser.com

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

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

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

  $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", '<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 class="search-excerpt">\0</strong>',  		$title);  ?>  

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

  strong.search-excerpt { background: yellow; }  

Получение всех картинок из 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. Повторюсь, эту функцию очень удобно использовать вместе с cURL.

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

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

Эта функция очень похожа на предыдущую, за исключением того, что вы можете задать тегу нужный атрибут. Например, вы легко сможете найти <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.")[^>]*$attrs*=s*".   "(['"])$value[^>]*>(.*?)</>/"     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. Если ваш сайт находится в их числе, почему бы не использовать PHP и регулярные выражения для разбора логов апача?

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

Замена двойных кавычек “умными” кавычками

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

  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: Использование регулярного выражения для получения картинок из записи

Поскольку многие из вас являются пользователями 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);  

Перевод статьи “15 PHP regular expressions for web developers”, автор Jean-Baptiste Jung

dreamhelg.ru

Здраствуйте уважаемые пользователи многофункциональной программы (парсер) Content Downloader
Прежде всего большое спасибо автору программы (Сергею) за дополнения функции регулярный выражений в программе.

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

В Content Downloader поддерживаются регулярные выражения где только можно (фильтр ссылок, сканер ссылок, в полях "поиск-замена", в макросах "поиск-замена", в фильтре и т.д.)
Чтобы использовать в заменах, надо указывать начало с оператора "re:" и потом само рег.выражение.

Вот несколько простых примеров применения рег. выражений:

таким способом мы отлавливаем цифры и в итоге выделяем их метками <cifri>

таким способом мы отлавливаем только русские буквы и в итоге выделяем их метками <rusbukvi>

Как видите использованы простые обозначения, давайте разберем:
re: — это оператор, без него никак
() — скобками мы выделили рег. выражение чтоб его значение вывести в переменную которая указывается доларром и цифрой (выше это было $1)
[] — в квадратных скобках указывается значение (чуть ниже в скриншоте смотрите подробности) цифры 0-9 или англиские буквы a-z
+ — плюсик после закрывающеся квадратной скобку указывает что совпадение должно быть от одного и более

Набор часто-используемых замен регулярными выражениями в Content Downloader:

1.Сделать один пробел вместо — переносов строк и множественных табов/пробелов:
2. Убрать всякие кавычки и ненужные символы в предложении:
3. Множественные пробелы сделать как один пробел:
4. В редакторе CSV файлов надо както отметить пустые ячейки, например добавим там DELETE123
5. Удалить отступы/пробелы/табы до и после
6. Картинкам очистить все параметры и оставить ссылку только на большую картинку (в статьях WordPress)
Список пополняется …

Вот шпаргалка интересная — Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме!

[​IMG]

forum.sbfactory.ru

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

  • «включить поиск замену» ,
  • «дополнительные настройки границ» ,
  • в шаблоне вывода используя макросы  [REPLACE( re:В.*З|автоваз)]

Для включения регулярных выражений в функциях поиск-замены необходимо добавить параметр re: в начало нужных строк. Например:

Во второй строке регулярное выражение .* работать не будет, так как перед ней нет параметра re:. Во второй строке будет искаться В.*З и заменяться на автоваз. В третьей строке будут искаться все выражения с В в начале и с З на конце. Например: ВАЗ, ВОЗ, Волшебный таЗ. Регулярные выражения работают как в общей функции поиск-замены, так и в функциях поиск-замены из «дополнительных настроек границ парсинга».

Синтаксис регулярных выражений (оригинал находится тут)

Для замены куска текста с динамической серединой используется регулярное выражение .*. Например, если нужно заменить все теги ссылок, ведущие на определенный сайт, в функцию поиск-замены введем следующую строку:

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

re:<td><b>[^<>]+</b></td>| или re:<br>(w+s+w+)<br>| — указывает что среди этих тегов есть чтото (ибо .* захватывает много) и это мы вырезаем.
re:(d{2}):(d{2}):(d{2}) UTC| — формат даты через двоеточие, (было применено для вывода даты без времени в конце статьи в таком виде «Дата публикации:08.07.2010 11:15:44 UTC «)
re:^Анатолийская палитра — ([0-9]+)$| — указывает на слово с меняющееся цыфрой, которое вырезаем из текста.
re: (?-m)^s*(.*?)s*$|1 — удаление лишних пробелов вначале и после предложений
re:<p>UNKNOWN ({.*?})</p>| — удалить <p>UNKNOWN {13245465677всяке-буквы-и-т.д.}</p> этот кусок

Вы также можете составить нужное рег.выражение используюя онлайн сервис  http://gskinner.com/RegExr/

Рассмотрим как можно еще применить регулярные выражения

Допустим парсим магазин и артикул имеется только в названии товара,

Бра Luminex 3099 Nut

Настенный светильник Nowodvorski Biedronki 2293

Люстра Premium Fleur 302/20 золото с белой подсветкой

будем выбирать из наименования товара несколько символьную цифру которая в некоторых случаях идет со слешем /

1. В дополнительные настройки границ выбираем границу артикула и добавляем  re:([0-9/]{3,7})|($1)

Теперь регулярное выражение выделяет в скобочки артикул  Бра Luminex (3099) Nut

2. Осталось выбрать только то что в скобках, поскольку макрос REPLACE выполняется почти последним из общего порядка функций, то выполним выборку таким способом

[REPLACE(({get})|{get})]<CD_GRAN_4!>[/REPLACE]

3.  В результате получили только чистый арикул  3099

п.с. В комментариях пишите свои замечания и варианты

Content downloader регулярные выражения

sbfactory.ru

Получение страниц сайтов с помощью file_get_contents

Итак, для начала давайте поучимся получать страницы сайтов в переменную PHP. Это делается с помощью функции file_get_contents, которая чаще всего используется для получения данных из файла, однако, может быть использована для получения страницы сайта — если передать ей параметром не путь к файлу, а url страницы сайта.

Учтите, что эта функция не идеальна и существует более мощный аналог — библиотека CURL, которая позволяет работать с куками, с заголовками, позволяет отправлять формы и переходить по редиректам. Все это file_get_contents делать не умеет, однако для начала нам сойдет и она, а работу с CURL мы разберем в следующем уроке.

Итак, давайте для примера получим главную страницу моего сайта и выведем ее на экран (сделайте это):

Что вы получите в результате: у себя на экране вы увидите страницу моего сайта, однако, скорее всего без CSS стилей и картинок (будут ли работать CSS и картинки — зависит от сайта, почему так — разберем попозже).

Давайте теперь выведем не страницу сайта, а ее исходный код. Запишем его в переменную $str и выведем на экран с помощью var_dump:

Учтите, что var_dump должен быть настроен корректно в конфигурации PHP (см. предыдущий урок для этого). Корректно — это значит вы должны видеть теги и не должно быть ограничения на длину строки (код страницы сайта может быть очень большим и желательно видеть его весь).

Итак, если все сделано хорошо, и вы видите исходный код страницы сайта — самое время приступить к его парсингу с помощью регулярных выражений.

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

Должна быть включена директива allow_url_fopen http://php.net/manual/ru/filesystem.configuration.php#ini.allow-url-fopen

Парсинг с помощью регулярных выражений

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

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

Подводные камни

Первая неожиданность, которая ожидает вас при использовании preg_match и preg_match_all — это то, что они работают только для тегов, целиком расположенных на одной строке (то есть, в них нету нажатого энтера). Если попытаться спарсить многострочный тег — у вас ничего не получится, пока вы не включите однострочный режим с помощью модификатора s. Вот таким образом:

Вторая неожиданность ждет вас, когда вы попробуете поработать с кириллицей — в этом случае нужно не забыть написать модификатор u (u маленькое, не путать с большим), вот так:

Таким образом я рекомендую вам всегда работать с этими двумя модификаторами, вот так:

Какие еще подводные камни вас ждут — будем разбирать постепенно в течении данного урока.

Попробуем разобрать теги

Пусть мы каким-то образом (например, через file_get_contents) получили HTML код сайта. Вот он:

Давайте займемся его разбором. Для начала давайте получим содержимое тега <title>, тега <head>, и тега <body>.

Итак, получим содержимое тега <title> (в переменной $str хранится HTML код, который мы разбираем):

Содержимое <head>:

Содержимое <body>:

В общем-то ничего сложного нет, только обратите внимание на то, что как уголки тегов, так и слеш от закрывающего тега экранировать не надо (последнее верно, если ограничителем регулярки является не слеш /, а, например, решетка #, как у нас сейчас).

Однако, на самом деле наши регулярки не идеальны. При некоторых условиях они просто откажутся работать. Вы должны быть готовы к этому — сайты, которые вы будете парсить — разные (часто они еще и устаревшие), и то, что хорошо работает на одном сайте, вполне может перестать работать на другом.

Что же у нас не так? На самом деле тег <body> — такой же тег, как и остальные и в нем вполне могут быть атрибуты. Чаще всего это атрибут class, но могут быть и другие (например, onload для выполнения JavaScript).

Итак, перепишем регулярку с учетом атрибутов:

Но и здесь мы ошиблись, при чем ошибок несколько. Первая — следует ставить не плюс +, а звездочку *, так как плюс предполагает наличия хотя бы одного символа — но ведь атрибутов в теге может и не быть — и в этом случае между названием тега body и уголком не будет никаких символов — и наша регулярка спасует (не понятно, что я тут написал — учите регулярки).

Поправим эту проблему и вернемся к дальнейшему обсуждению:

Вторая проблема следующая: если внутри <body> будут другие теги (а так оно и будет в реальной жизни) — то наша регулярка <body.*> зацепит лишнего. Например, рассмотрим такой код:

Регулярка <body.*> найдет не <body class=»www»>, как ожидалось, а <body class=»www»><p>Абзац{

} — потому что мы не ограничили ей жадность. Сделаем это: место <body.*> напишем <body.*?> — в этом случае будет все хорошо.

Но более хорошим вариантом будет написать вместо точки конструкцию [^>] (не закрывающий уголок), вот так — <body[^>]*?> — в этом случае мы полностью застрахуем себя от проблем такого рода, так как регулярка никогда не сможет выйти за тег.

Получение блока по id

Давайте рассмотрим следующий код:

Напишем регулярку, которая получит содержимое блока с id, равным content.

Итак, попытка номер один (не совсем корректная):

Что здесь не так? Проблема с пробелами — ведь между названием тега и атрибутом может быть сколько угодно пробелов, так же, как и вокруг равно в атрибутах.

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

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

Давайте поправим нашу регулярку:

Обратите внимание на то, что вокруг равно пробелы могут быть, а могут и не быть, поэтому там стоит оператор повторения звездочка *.

Кроме того, перед закрывающем уголком тега тоже могут быть пробелы (а могут и не быть) — учтем и это:

Итак, уже лучше, но еще далеко не идеал — ведь вокруг атрибута id могут быть и другие атрибуты, например так: <div class=»www» id=»content» onclick=»»>. В этом случае наша регулярка спасует. Давайте укажем, что могут быть еще и другие атрибуты:

Обратите внимание, что после <div стоит регулярка .+?, а перед > стоит регулярка .*? — это не ошибка, так и задумано, ведь после <div обязательно должен идти пробел (то есть хотя бы один символ точно будет), а перед > может вообще не быть других атрибутов (кроме нашего id) и пробела тоже может не быть.

Регулярка стала еще более хорошей, но есть проблема: лучше не использовать точку в блоках типа .*? — мы вполне можем хватануть лишнего выйдя за наш тег (помните пример выше с body?). Лучше все-таки использовать [^>] — это гарантия безопасности:

Следующая проблема: кавычки-то в атрибутах могут быть как одинарными, так и двойными (их даже может вообще не быть, если значение атрибута — одно слово, но этот случай редкий — не будем его учитывать, если вам встретится такой сайт — проще написать регулярку специально для него). Итак, учтем это:

Обратите внимание на то, что одинарная кавычка заэкранирована — мы это делаем, так как внешние кавычки от строки PHP у нас тоже одинарные, вот тут:

В общем-то регулярка достаточно хороша, но иногда идут дальше и делают так, чтобы первая кавычка от тега совпадала со второй (исключаем вариант id=»content’). В этом случае делают так — первая кавычка ложится в карман, а вторая кавычка указывается карманом, чтобы совпадала с первой:

Для нашей задачи это особо не нужно (можно быть точно уверенным, что такое id=»content’ — врядли где-то будет), но есть атрибуты, где это существенно. Например, в таком случае: <div title=»Рассказ о д’Артаньяне»> — в атрибуте title вполне может затесаться одинарная кавычка и регулярка titles*?=s*?[«‘](.+?)[«‘] вытянет текст «Рассказ о д» — потому что поиск ведется до первой кавычки.

А вот регулярка titles*?=s*?([«‘])(.+?)1 будет корректно обрабатывать <div title=»Рассказ о д’Артаньяне»> и даже <div title=’Рассказ о д»Артаньяне’>.

Проблема вложенных блоков

В нашей регулярке есть еще одна проблема — она не может работать с вложенными блоками. Например, если внутри дива #content есть еще один див — регулярка найдет текст до первого закрывающего </div>, а не для закрывающего дива для #content. Пример проблемного кода:

Наша регулярка вытянет только <div id=»content»><div>Див внутри контента</div> — остановится на первом же </div>. Что делать в этом случае?

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

Ну, а что делать — нужно просто привязываться не к </div>, а к тому, что стоит под нашим блоком (в нашем случае под контентом). В приведенном ниже коде под ним стоит <div id=»footer»> — можно привязаться к нему или к <!— end of content —> — и так, и так будет хорошо.

В HTML5 появились новые теги — header, footer, main (для контента) — с ними работать гораздо удобнее, ведь в них исключена вложенность. И очень часто вместо <div id=»content»> можно увидеть просто <main> — и парсинг становится проще.

Кодировка документа

Иногда вам придется парсить не современные сайты, а достаточные старые. На таких сайтах кодировка чаще всего установлена в windows-1251. Поэтому, если вы попытаетесь получить русскоязычные тесты с этого сайта, вы вместо русских букв увидите вопросики — это первый признак сбившейся кодировки.

В этом случае следует воспользоваться функцией iconv, которая перекодирует текст из устаревшего windows-1251 в современный utf-8:

Как понять по HTML коду сайта, что в нем не та кодировка? Посмотрите на тег meta charset. Он может выглядеть так <meta http-equiv=»content-type» content=»text/html; charset=utf-8″> или так <meta http-equiv=»content-type» content=»text/html; charset=windows-1251″>. Во втором случае кодировка не та.

Кстати, в HTML5 кодировка устанавливается так , а варианты кодировки с http-equiv=»content-type» устарели. Однако, на сайтах сейчас можно встретить и тот, и другой вариант.

Кстати, на сайте может вообще не быть тега meta charset — в этом случае кодировка файла windows-1251 (в подавляющем большинстве случаев).

code.mu

а вы присмотритесь. выделенное жирным полностью дублируется в остальном тексте.
эта штука понадобилась мне для очистки новостного дайджеста, в который сведены десятки новостей. в нем не нужны повторяющиеся предложения, он и так большой.
регулярка чистит строку по принципу: если строка начинается с 30 и более символов, которые повторяются дальше по тексту, то часть текста между этими символами и до совпадающего с ними фрагмента (включая его) удаляется. я их поставил вообще 2 подряд, на случай, если предложение повторяется 3 раза (бывало и такое).

вот пример новости в которой есть "дубль" —
Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме!

дублирующиеся фразы:
Главной сенсацией футбольного дня 18 августа стало поражение киевского «Динамо» в Полтаве от местной «Ворсклы» 0:1. Тем временем, «Металлист» в Ужгороде разгромил «Говерлу» 3:0. Ничьи были зафиксированы в матчах «Кривбасс» — «Днепр» (0:0) и «Металлург Д» — «Таврия» (1:1). И в первом матче 6-го тура «Арсенал» обыграл «Ильичевец» 2:1. Фото obozrevatel.com Главной сенсацией футбольного дня 18 августа стало поражение киевского «Динамо» в Полтаве от местной «Ворсклы» 0:1. Полтавчане воспользовались одним из немногих своих моментов, в то время, как полуторный состав киевлян — свои не реализовал. Тем временем, «Металлист» в Ужгороде разгромил «Говерлу» 3:0. Ничьи были зафиксированы в матчах «Кривбасс» — «Днепр» (0:0) и «Металлург Д» — «Таврия» (1:1). И в первом матче 6-го тура «Арсенал» обыграл «Ильичевец» 2:1.

после обработки станет так:
Главной сенсацией футбольного дня 18 августа стало поражение киевского «Динамо» в Полтаве от местной «Ворсклы» 0:1. Полтавчане воспользовались одним из немногих своих моментов, в то время, как полуторный состав киевлян — свои не реализовал. Тем временем, «Металлист» в Ужгороде разгромил «Говерлу» 3:0. Ничьи были зафиксированы в матчах «Кривбасс» — «Днепр» (0:0) и «Металлург Д» — «Таврия» (1:1). И в первом матче 6-го тура «Арсенал» обыграл «Ильичевец» 2:1.

для дайджеста — самое оно. алгоритм стремный (может нарезать лишнего) но пока что работает безотказно.

forum.sbfactory.ru


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.