2012-03-16 14 views
1

これで、すべてのリンクが有効であれば私のサイトをチェックするためにPHPでアプリケーションを書いています。PHP内からHTMLの特定の部分を抽出する

問題が発生しました。 SimpleXmlとDOMDocumentオブジェクトを使用してタグを抽出しようとしましたが、サンプルサイトでアプリを実行すると、SimpleXmlオブジェクトタイプを使用すると大抵の場合エラーが発生します。

SimpleXmlを使用するのと同じくらい簡単なhref属性のhtmlドキュメントをスキャンする方法はありますか?

<?php 
    // what I want to do is get a similar effect to the code described below: 

    foreach($html->html->body->a as $link) 
    { 
     // store the $link into a file 
     foreach($link->attributes() as $attribute=>$value); 
     { 
       //procedure to place the href value into a file 
     } 
    } 
?> 

ので、基本的に私は上記の操作を予備成形する方法を探しています。事は、私は現在、私は得ることの次原始的な方法を使用しています、ただ明確にする...私は私はそれでhtmlコードを取得していた文字列を扱うべきかのよう

を混乱していていますhtmlファイル:

<?php 
$target  = "http://www.targeturl.com"; 

$file_handle = fopen($target, "r"); 

$a = ""; 

while (!feof($file_handle)) $a .= fgets($file_handle, 4096); 

fclose($file_handle); 
?> 

どれ情報が役に立つだけでなく、上記の問題は、よりエレガントに(のpython、CまたはC++)を固定されている他の言語の選択肢だろう

答えて

1

を検索することができます。

$target = "http://www.targeturl.com"; 
$result = file_get_contents($target); 
$dom = new DOMDocument; 
$dom->preserveWhiteSpace = false; 
@$dom->loadHTML($result); 

$links = extractLink(getTags($dom, 'a',)); 

function extractLink($html, $argument = 1) { 
    $href_regex_pattern = '/<a[^>]*?href=[\'"](.*?)[\'"][^>]*?>(.*?)<\/a>/si'; 

    preg_match_all($href_regex_pattern,$html,$matches); 

    if (count($matches)) { 

    if (is_array($matches[$argument]) && count($matches[$argument])) { 
     return $matches[$argument][0]; 
    } 

    return $matches[1]; 
    } else 

function getTags($dom, $tagName, $element = false, $children = false) { 
    $html = ''; 
    $domxpath = new DOMXPath($dom); 

    $children = ($children) ? "/".$children : ''; 
    $filtered = $domxpath->query("//$tagName" . $children); 

    $i = 0; 
    while($myItem = $filtered->item($i++)){ 
     $newDom = new DOMDocument; 
     $newDom->formatOutput = true;   

     $node = $newDom->importNode($myItem, true); 

     $newDom->appendChild($node); 
     $html[] = $newDom->saveHTML();   
    } 

    if ($element !== false && isset($html[$element])) { 
     return $html[$element]; 
    } else 
     return $html; 
} 
+0

をしようとしてくれてありがとう、私は間違いなくあげることを、より多くのエレガントな何かが必要だろうこのショットは、いくつかの項目をルックアップする必要があるが、私は今私が探す必要があることを見て、それは問題ではないと思う –

+0

DOMDocumentとDOMXPathは非常に素晴らしいと貧しい/壊れたHTMLでも非常に寛容です。あなたはそれでできる負荷があります:) –

+1

ええ、私はDOMXPathを試し始めました。そしてそれは楽しみのような継ぎ目です。しかし、私はphp.netで提供されているものより深いドキュメンテーションが必要になります。その例は、私が望むほど有益ではありません。 –

0

あなただけstrpos($html, 'href=')を使用し、解析することができURL。また、あなたはここで、我々は我々が書いたHTMLの構文解析ツールに使用するコードの束だDOMDocument::loadHTML

を使用することができます<a.php

+0

私は、上記のsonassi申し出により溶液(私はそれを見るように)問題へのよりエレガントな解決策が、:)素敵な –

関連する問題