2011-10-15 96 views
0

我想在网站上做一些动态CSS样式更新,并且需要使用PHP over JavaScript。我只需要标记其中包含img标记的div标记,并忽略div标记的其余部分。PHP DOM检查img是否在div内

这是我到目前为止有:

 

    $dom = new domDocument; 
    $dom->loadHTML($test); 
    $dom->preserveWhiteSpace = false; 

    $divs = $dom->getElementsByTagName('div'); 
    foreach ($divs as $div) { 
     $saveXML[] = $dom->saveXML($div); 
     $childNotes[] = $div->getChildNodes; 
    } 

我只是想在这里两种方法。 $saveXML选项的问题在于它给我提供了包含封装div的全部代码。我不想那样。此外,从现在开始,我将不得不在代码上运行正则表达式或其他代码,以查找它是否在其中包含img标记。

$childNodes选项应该是我认为最好的,但数组返回空。这本来是不错的,因为我可以简单地试图像

 

    if ($childNode->nodeType == 'img'){ 
     $div->setAttribute('class', $new_attributes); 
    } 

东西(我没有想到,最后一位了充分但那是一般概念)..

下面是HTML代码我的一个样本需要通过

 

    div class="image-left drop-shadow raised" style="width: 210px"> 
     img src="images/myimage.jpg" width="200" height="150" class="size-full"/
     p>EDIT THIS DIV's STYLE /p> 
    /div> 
    div class="blocktext" style="width: 150px;"> 
     p>DONT EDIT THIS DIVs STYLE /p> 
    /div> 

任何帮助,请搜索...

回答

0

我希望你的样品未启用HTML的实际HTML UR使用。许多ur标签没有完成打开/关闭“<”的。

但是,如果它不是,那么你可以使用:

$childNode->getElementsByTagName('img'); 

如果在它的图像或没有这将返回,从阅读http://php.net/manual/en/domdocument.getelementsbytagname.php我得到这样它会返回一个列表...我可以是错的,但是在那里抛出想法。

+0

完全!我几乎无法理解HTML。 –

+0

啊愚蠢的文本编辑器一直在想,代码的一点是页面上的实际代码,它会消失...所以我只是删除它们的具体情况。我知道他们应该有<的:) –

0

你通常做的是与Xpath query

$xp = new DOMXPath($dom) 
$divsContainingImg = $xp->query('//div/img/..'); 
foreach ($divsContainingImg as $div) 
{ 
    /* @var $div DOMElement */ 
    ... 
} 

这将选择所有img元素是一个div元素的直接孩子,然后它的父(在div元素)。