Хабрастат

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

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

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

Ведь полезный опыт.



Проблема первая

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

на языке javascript. Но тут меня ждала бритва в виде политики безопасности, поэтому все мои попытки ajax-запросов и iframe оказались безуспешными.

Я подсознательно понимал, что в js будет какой-то баг.



Проблема вторая, сложная

Думаю, ладно, напишу на PHP (хотя очень хотелось писать на Python, который я изучаю понемногу, но это заняло бы много времени).

Я продумал детали и начал писать код. Я получил рейтинги комментариев первого уровня с помощью инструментов DOM. В голове крутятся мысли «нужно их довести до целых».

Я так понимаю, есть значения 0, значения с плюсом и минусом.

Пусть будет минус, плюс я его отрезал, кастовал фаербол в целом, посмотрим, что выйдет через print_r. Я знал, что должен был столкнуться с рейтингом -34, но не тут-то было! Я впал в такой ступор, что решил пойти немного прогуляться и развеять свой кипящий от удивления мозг.

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

Исправление выглядит как костыль; Очень надеюсь, что на хабе есть люди, знающие грамотное решение проблемы (обратите внимание, что на stackoverflow и php мануале я не нашел ответа, может плохо искал?):

  
  
   

/** * Here is awesome "-" * Parsed num is -34 * var_dump($num); string(5) "–34" * TODO: FIX THIS UTF-8 SHIT */ if (strlen($int) !== strlen($num)) { preg_match('/\d+/', $num, $m); $int = intval('-' .

$m[0]); }



Немного полезной информации



ошибки libxml

При загрузке данных в объект DOMDocument мои сущности были плохо проанализированы и, естественно, я получил E_WARNING. Хорошо, что это не первый опыт работы с DOM, поэтому на этом я и завершился.



libxml_use_internal_errors(true); $dom->loadHTML('html content'); libxml_clear_errors();

Функции описывать не буду; в документации все прекрасно описано.

Хорошая новость в том, что вам нужно снова вызвать libxml_use_internal_errors с указанным параметром false, но так как мне больше ничего парсить не нужно, поэтому я решил опустить этот пункт.

DOMXпуть

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

Я понял, что моим корневым элементом является div#comments, поэтому сохранил его для дальнейшего использования.

И сам запрос xpath был инкапсулирован.

DOMXPath-> запрос возвращает DOMNodeList. Я добавил DOMElement[], чтобы сохранить автозаполнение для IDE при переборе результатов в цикле foreach. Плюс я добавил возможность указать собственный контекст, который может понадобиться в будущем.

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



/** * Execute xpath query * * @param string $query XPath query * @param DOMNode $context [Optional] Context * @return DOMNodeList|DOMElement[] */ private function query($query, DOMNode $context = null) { if ($context === null) { $context = $this->context; } return $this->xpath->query($query, $context); }



ПРИКОНЧИ ЕГО

Ссылка на проект: github.com/miraage/habrastats Для локальных тестов я сохранил файл habratopic.htm, чтобы не ждать каждый раз загрузки темы.

Тема по умолчанию — Хабракамп.

Можно отправить через habrastats.phpЭid=XXXX.

Хабрастат

На данный момент нет места для размещения демо.

УПД.

Товарищ Анонимный выложил демо: habrastats.m.tom.ru

Обновлять

Совсем забыл сказать! Это всего лишь промежуточный эскиз.

Как только сделаю все дела, доведу сценарий до ума.



Конец

Буду рад вашим комментариям, наблюдениям, конструктивной критике и пул-реквестам.

P.S. Если вы все же решили сделать пул-реквест, то делайте это из отдельной фиче-ветки.

В этот В статье достаточно четко описана работа с ветками в git. Теги: #php #habrastats #статистика #dom #xpath #php #программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.