2016-08-04 143 views
-2

我的HTML代碼,更好的方法是代碼重複16次:用簡單的HTML DOM解析器

<div class="headline_image"> 
<a ga-cat="slideshow-view" ga-action="view-1" href="mylink"><img src="http://dd4994.jpg" width="420" height="323" align="right" alt="my text "/></a> 
</div> 

我想所有的IMGS鏈接和文本也HREF我做了什麼:

for ($x = 0; $x <= 15; $x++) { 
$imglink = $html->find('div[class=headline_image] img', $x)->getAttribute('src'); 
$mytext = $html->find('div[class=headline_image] img', $x)->getAttribute('alt'); 
$postlink = $html->find('div[class=headline_image] a', $x)->getAttribute('href'); 
    echo '<br/>'; 
    echo $mytext; 
    echo '<br/>'; 
    print_r($postlink); 
    echo '<br/>'; 
    } 

代碼很慢,有什麼變化?

+1

你每掃描一次find()調用的整個dom。找到所有這些div的CONTAINER元素,然後您可以從此處開始掃描。 –

+0

,你能舉個例子嗎?對不起,這一定是愚蠢 – user2686117

回答

0

您使用太多的匿名對象來減慢代碼速度。這意味着你不會將函數的結果放入一個變量中,而只是「隨時隨地」使用它。這需要一次又一次地運行你的功能,放慢你的項目。

因爲你可以使用函數find返回一個數組,我建議你在for循環之前這樣做。

$imgarray = $html->find('div[class=headline_image] img', $x); 

這種方式運行$html->find只有一次,而不是十六倍。在for循環中,您可以將其用作數組並使用結果:$imgarray[$x]。你可以在$anchorarray中做同樣的事情,你的代碼會加快,你會看到的。

另一種解決方案是在容器中使用PHP DOM $childNodes,該容器中可找到該項目(或主體元素)。這將返回16個div元素,您可以在中調用<a>元素,然後再爲<img>元素調用$ firstChild,以便在其中導航。也許這是你要修改的網站(如添加更多的內容,以結束等)的情況下更加安全

+0

謝謝!你對新代碼有什麼看法? – user2686117

0

嘿丹尼爾我改變了代碼:

$imgarray = $html->find('div[class=headline_image] img'); 
$linkarray = $html->find('div[class=headline_image] a'); 
for ($x = 0; $x <= 15; $x++) { 

echo $imgarray[$x]->getAttribute('src'); 
    echo '<br/>'; 
    echo $imgarray[$x]->getAttribute('alt'); 
    echo '<br/>'; 
    echo $linkarray[$x]->getAttribute('href'); 
    echo '<br/>'; 

    } 
0

一般正確的方法迭代看起來像這樣: