2012-01-14 13 views
0

特定の属性を持つra divを取得するsnipplrでこの関数が見つかりました。私はそれを使用しようとしましたが、動作しませんでした。それを使用する方法に何か間違っていますか?この関数を使ってdivを取得する方法

http://snipplr.com/view.php?codeview&id=20987

function get_tag($attr, $value, $xml, $tag=null) { 
    if(is_null($tag)) 
    $tag = '\w+'; 
    else 
    $tag = preg_quote($tag); 

    $attr = preg_quote($attr); 
    $value = preg_quote($value); 

    $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". 
       "(['\"])$value\\2[^>]*>(.*?)<\/\\1>/" 

    preg_match_all($tag_regex, 
       $xml, 
       $matches, 
       PREG_PATTERN_ORDER); 

    return $matches[3]; 
} 

私はこのようなURLのためにそれを使用するように変更した:

function get_tag($attr, $value, $page, $tag=null) { 
    if(is_null($tag)) 
    $tag = '\w+'; 
    else 
    $tag = preg_quote($tag); 

    $attr = preg_quote($attr); 
    $value = preg_quote($value); 

    $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". 
       "(['\"])$value\\2[^>]*>(.*?)<\/\\1>/"; 
$page = file_get_contents($page); 
    preg_match_all($tag_regex, 
       $page, 
       $matches, 
       PREG_PATTERN_ORDER); 

    return $matches[3]; 
} 


get_tag("class","weather","http://www.masrawy.com","div"); 

は、どのように私はこれを正しく使用することができますか?

+0

あなたは 'のfile_get_contents()'からのエラー復帰をチェックすべきか? – sarnold

+1

正規表現がうまくいかない理由は、読み込んでいるページで 'class =" weather "'で 'div'がネストされた' div'を含んでいるため、内部divの終了タグは外側のタグではなく、見つかった。間違いなく@ prodigitalsonの答えとしてDOMパーサを使用してください.. – Jacob

答えて

2

正規表現を使用しないでください。 DOMを解析して照会できるものを、DOMDocumentZend_Dom_Query、またはSimpleHTMLDOMのようなものを使用してください。

のDOMDocument例:

$dom = new DomDocument(); 

$html = file_get_contents('http://www.masrawy.com'); 
$dom->loadHTML($html); 

$finder = new DomXPath($dom); 
$classname="weather"; 
$nodes = $finder->query("//div[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]"); 

$extracted = array(); 
foreach($nodes as $element) 
{ 
    // convert to html string 
    $extracted[] = $element->ownerDocument->saveXML($element); 
} 

// now iterate over extracted and output... 

アンZend_Dom_Queryでの例:

$html = file_get_contents("http://www.masrawy.com"); 

$dom = new Zend_Dom_Query($html); 
$results = $dom->query('div.theCssClassName'); 

$extracted = array(); 
foreach($results as $element) 
{ 
    // convert to html string 
    $extracted[] = $element->ownerDocument->saveXML($element); 
} 

// now iterate over extracted and output... 
+0

私はちょうどcodeigniterを使用するので、私はzendフレームワークに精通していないので、これについては、このスニペットで私を助けることができる場合、私は願ってprodigitalsonを願って –

+0

そのスニペットを一貫して使うことはできませんし、今は間違いありません(最初の質問にJacobsのコメントを参照してください)。あなたは私があなたに与えたスニペットを超えてZFについて多くを知る必要はありません。 'Zend_Dom_Query'コンポーネントとその依存関係を、サードパーティのlibと同様に、CIのライブラリとして追加するだけです。しかし、あなたがそれをやりたいと思わないなら、PHPのネイティブな 'DOMDocument'を使って答えを更新しました。 SimpleHTMLDOMを使用することもできます。多くの人が使っているようですが、私は決して持っていません - そのための例はありません:-) – prodigitalson