Хабрастатистика Собственно, после появления довольно интересной и популярной темы Хабракамп товарищ опиум созданный вопрос , где предложил создать скрипт статистики.
Несмотря на работу, личную жизнь и другие факторы, которые задержали создание сценария, я все же в какой-то степени его довел до конца.
Я также столкнулся с проблемами, которых никогда раньше не видел.
Ведь полезный опыт.
Проблема первая
Изначально, когда я увидел тему, мне хотелось клиентский скрипт, т.е.на языке 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 #программирование
-
Youtube Для Художников – Методы Освещения
19 Oct, 24 -
Вечер Пятницы. Пришло Время Улыбаться!
19 Oct, 24 -
Один Из Самых Простых Вариантов Защиты Voip.
19 Oct, 24