2011-08-04 13 views
-2

同じサイトの多くのページからコピーリンクが必要です。 は次のようになります:/download.php?id=xxxxx 必要なページを持つためにIDに1を追加するだけです... これらのページでは、コード内のリンクを取る必要があります: href = "http: //www.site.com/xxxxxxxxxxxx " (xは変数)多くのページからリンクをコピーするスクリプト

可能でしょうか? おかげ

+8

はい、それは可能です。 –

+1

あなたはこれまでに何を試しましたか、これをあなた自身のためにしようとしましたか? psは正規表現の方法を使わないでください... –

答えて

2

は、正規表現を使用してそれを実行しようとしているWebページからURLやリンクテキストを取得しようとしたとき

は、おそらく最大の過ちの人々が作るHTMLを解析するREGEXを使用しないでください。ジョブは正規表現で行うことができますが、ドキュメント全体に何回もpregループを張るのに高いオーバーヘッドがあります。正しい方法と、より速く、無限にクールな方法は、DOMを使用することです。 getLinks関数でDOMを使用することで、ウェブページ上のすべてのリンクをキーとして、またリンク名を値として持つ配列を簡単に作成できます。この配列は、任意の配列やリストのようにループさせることができます。 HTMLを読み込むときにエラー抑制が使用されることに注意してください。これは、DOCTYPEで定義されていない無効なHTMLエンティティに関する警告を抑制するためです。もちろん、実稼働環境では、エラー報告は無効になり、エラー報告はnoneに設定されます。

<?php 
    function getLinks($link){ 
     $ret = array(); 

     /*** a new dom object ***/ 
     $dom = new domDocument; 

     /*** get the HTML via FGC, 
     Tho prefer using cURL instead but that's out of scope of the question.. 
     (@suppress those errors) ***/ 
     @$dom->loadHTML(file_get_contents($link)); 

     /*** remove silly white space ***/ 
     $dom->preserveWhiteSpace = false; 

     /*** get the links from the HTML ***/ 
     $links = $dom->getElementsByTagName('a'); 

     /*** loop over the links ***/ 
     foreach ($links as $tag){ 
      /*** only add download links to the return array ***/ 
      if(strpos($tag->getAttribute('href'),'/download.php?id=')!=false){ 
       $ret[$tag->getAttribute('href')] = $tag->childNodes->item(0)->nodeValue; 
      } 
     } 
     return $ret; 
    } 
?> 

使用例

<?php 
    /*** a link to search ***/ 
    $link = "http://www.site.com"; 

    /*** get the links ***/ 
    $urls = getLinks($link); 

    /*** check for results ***/ 
    if(sizeof($urls) > 0){ 
     foreach($urls as $key=>$value){ 
      echo $key . ' - '. $value . ' - ' . str_ireplace('http://www.site.com/download.php?id=','',$key). '<br >'; 
     } 
    }else{ 
     echo "No links found at $link"; 
    } 
?>