ハブラスタット

Habrastatistics



実際、かなり興味深い人気のトピックHabracampが登場した後同志のアヘンは、統計スクリプトの作成を提案する質問を作成しました。



スクリプトの作成を遅らせた仕事、個人的な生活、およびその他の要因にもかかわらず、私はそれをある条件にしました。



また、これまで見たことのない問題に遭遇しました。

結局のところ、有用な経験。



問題1



最初に、トピックを見たとき、クライアントスクリプト、つまり JavaScript言語で。

しかし、ここではセキュリティポリシーの形でかみそりが私を待っていたので、ajaxリクエストとiframeの試みはすべて失敗しました。 私は無意識のうちに、jsに何らかのジャークがあることを理解しました。



問題2、トリッキー



大丈夫、私はPHPで書くと思います(私は本当にPythonで書きたいと思っていましたが、ゆっくり勉強していますが、長い時間がかかります)。 詳細を熟考し、コードの記述を開始しました。

DOMツールを使用して、レベル1のコメント評価を得ました。 「それらを整数にする必要がある」という考えは、私の頭の中で展開されます。 値0、プラスとマイナスの値があることを理解しています。 それをマイナスにして、プラスでカスタムの火球を整数で切り取り print_rで何が起こったのかを確認します。 -34のレーティングを満たす必要があることは知っていましたが、彼はそこにいませんでした! 私はそのようなst迷に陥ったので、私は散歩に行き、驚きで沸騰した脳を払拭することにしました。

バグをどのように探していたかを伝えるために長い間、私はすぐに言います。問題はマイナス記号であり、何らかの理由で何らかの形でエンコードされていました。 松葉杖のように見える修正。 問題の有能な解決策を知っている人がハブにいることを本当に願っています(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();
      
      





機能については説明しませんが、すべてドキュメントに完全に記載されています。

良いためには、新しいパラメーターをfalseにしてlibxml_use_internal_errorsを呼び出す必要がありますが、 もう何も解析する必要はないので、この瞬間を省略することにしました。



DOMXpath



ご想像のとおり、DOMXPathクラスが戦いに参加しました。これにより、ドキュメント内の必要な要素を見つける作業が簡素化されます。

ルート要素がdiv#コメントであることを理解したので、将来の使用のために保存しました。 そして、xpath要求自体がカプセル化されます。

DOMXPath->クエリはDOMNodeListを返します。 DOMElement []を追加して、foreachループで結果を繰り返し処理しながらIDEのオートコンプリートを保存しました。

さらに、将来必要になる可能性のあるカスタムコンテキストを指定する機能を追加しました。 現在、質問への回答の計算を実装する方法を考えています(はい、何を非表示にするか、質問を収集するアルゴリズムもコメントツリーを再帰的にたどるように修正する必要があります)。ここでクエリコンテキストがちょうど間に合うことを理解しています。

 /** * 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ファイルを保存しました。

デフォルトのトピックはHabracampです。 habrastats.phpを通過できますか?Id = XXXX







現在、デモをホストする場所はありません。

UPD。

同志の匿名がデモをアップロードしました:

habrastats.m.tom.ru



更新する



私は完全に言うのを忘れていました! これは単なる中間スケッチです。

すべての問題を解決する方法-スクリプトを思い出します。



終わり





あなたのコメント、発言、建設的な批判、プルリクエストを歓迎します。



PS

それでも、プルリクエストを行うことにした場合は、ブランチの別の機能からプルリクエストを行います。

この記事では、Gitでのブランチの操作について明確に説明しています。



All Articles