Zend Framework 2でのURLの解析

チャレンジ:
  1. URLを含む文字列を解析するメソッドがあります。 文字列には絶対URLと相対URLの両方を含めることができ、これらの両方を正しく解析する必要があります。
  2. そして、シンクでは、絶対リンクの「間違った」形式には「http://」がありません。 さらに、「間違った」形式のリンクのテキストに沿って、 不完全な絶対リンクと呼びます
  3. 「RF」ドメインのサポートを実装します。


例:site.ru/page.php/page.phpsite.ru/page.php
スキームhttp
ホストsite.rusite.ru
page.phppage.phppage.php

タスクのパラグラフ1および2の実装


Zend\Uri\Httpクラスはこれに役立つはずです。 parse($uri)getHost()getPath()などが必要なメソッドがありparse($uri)
しかし!site.ru/page.php 」なし)などのURLを解析する場合、 getHost()は空の文字列を返し、 getPath()は「 site.ru/page.php 」を返します。

これが私が望むことを達成する私の方法です 。 絶対的に不完全なリンクの形式は、ソースに関連するリンク(相対リンクのタイプ)と同じです。 TDL(第1レベルドメイン)をチェックすることにより、絶対的な不完全なリンクを認識することができます。 そのようなドメインが存在する場合、リンクは完全に不完全であると考えることができます。

  public function myParse($url){ $Http = new Http($url); if($Http->isValidRelative()){ //  url    $path = $Http->getPath(); //  path   «/» —       «»    //    if( $path{0} !== '/' ){ //     ... $absoluteUrl = '//'.urldecode($Http->toString()); $absoluteHttp = new Http($absoluteUrl); // (1) $Hostname = new Hostname(array('allow'=>Hostname::ALLOW_DNS, 'useTldCheck'=>false)); $decode = true; // ...       (2) if ($Hostname->isValid($absoluteHttp->getHost($decode))) { //     ,    «»  $Http = $absoluteHttp; } } } return $Http; } 

コードコメント

  1. Zend\Validator\Hostnameを設定して、 $validIdns内のリンクの第1レベルドメインの存在を確認します。
  2. $decode = true;パラメータをgetHost()メソッドにgetHost() $decode = true; ホストをデコードするため。 Zend\Uri\HttpクラスのgetHost()メソッドは、パラメーターを想定せず、何もデコードしません! なぜ、そしてそれはどのように機能しますか?!..以下をお読みください。

タスクのパラグラフ3の実装。 ロシア連邦のIDNと連携


残念ながら、ZF2は実際にはIDNで動作しません。これを補正する必要があります。 これを行うには、punycodeを使用してurlをエンコードおよびデコードする任意のクラスをダウンロードし、 Zend\Uri\Httpクラスを拡張します。

 namespace Application\Other; use Zend\Uri\Http as ZendHttp; use Application\Model\IdnaConvert; class Http extends ZendHttp { public function setHost($host){ if($host){ $idn = new IdnaConvert(); $host = $idn->encode($host); } return parent::setHost($host); } public function getHost($decode=false) { if($decode && $this->host){ $idn = new IdnaConvert(); return $idn->decode($this->host); } return parent::getHost(); } } 

したがって、 myParse()メソッドは、URLを解析するときにRFドメインをエンコードできる拡張Httpクラスを使用する必要があります。 getHost($decode)メソッドを呼び出すと、メソッドに渡されたパラメーターに応じて、Punycode表現またはデコードされた表現を返すことができます。

PS上記の品質には疑問がありますが、これは同時に、ZF2に関してより経験のある人々の意見を見つけるために投稿を公開する理由の1つです。 別の理由-この一見明らかなタスクの解決策を見つけたことがありません。 たぶんあなたから、私は他の人、おそらくよりシンプルでより有能なオプションについて学びます。

Source: https://habr.com/ru/post/J198614/


All Articles