我有一个看起来像这样的结构
<div class="table">
<div> <p> name1 </p> <p> title1 </p> </div>
<div> <p> name2 </p> <p> title2 </p> </div>
<div> <p> name3 </p> <p> title3 </p> </div>
</div>
然后又继续了几百次。我可以在php中写什么来搜索(class =“table”&gt; div)并将类添加到每个'div'中的第一个'p'?
答案 0 :(得分:4)
$str = '<div class="table">
<div> <p class="first"> name1 </p> <p> title1 </p> </div>
<div> <p> name2 </p> <p> title2 </p> </div>
<div> <p> name3 </p> <p> title3 </p> </div>
</div> ';
$dom = new DOMDocument;
$dom->loadHTML($str);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//div[@class="table"]/div/p[position()=1]');
$addClass = 'first';
foreach($nodes as $node) {
if ($node->hasAttribute('class')) {
$classes = preg_split('/\s+/', $node->getAttribute('class'));
if (in_array($addClass, $classes)) {
continue;
}
} else {
$classes = array();
}
$classes[] = $addClass;
$node->setAttribute('class', implode(' ', $classes));
}
var_dump($dom->saveHTML());
更新为不添加first
两次:)
string(340) "<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div class="table">
<div> <p class="first"> name1 </p> <p> title1 </p> </div>
<div> <p class="first"> name2 </p> <p> title2 </p> </div>
<div> <p class="first"> name3 </p> <p> title3 </p> </div>
</div></body></html>
"
您可能已经注意到DOMDocument 帮助为您添加HTML包装器标签(html
,body
等)。
您可以像{...}那样获取body
元素的内部HTML。
$output = '';
foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $node) {
$output .= $dom->saveXML($node);
}
<div class="table">
<div> <p class="first"> name1 </p> <p> title1 </p> </div>
<div> <p class="first"> name2 </p> <p> title2 </p> </div>
<div> <p class="first"> name3 </p> <p> title3 </p> </div>
</div>
答案 1 :(得分:0)
使用PHP DOMDocument遍历它并添加属性:
http://php.net/manual/en/class.domdocument.php
http://www.php.net/manual/en/domelement.setattribute.php
比字符串搜索更清洁。
答案 2 :(得分:0)
有一个名为phpQuery
的图书馆:http://code.google.com/p/phpquery/
您可以像jQuery
一样遍历DOM对象:
phpQuery::newDocument($htmlCode)->find('div.table div')->find('p:first').attr('class', 'myVal');;
答案 3 :(得分:0)