php搜索并替换div中的第一个元素

时间:2011-03-17 07:54:17

标签: php search html replace

我有一个看起来像这样的结构

<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'?

4 个答案:

答案 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包装器标签(htmlbody等)。

您可以像{...}那样获取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)

你会考虑在javascript中这样做吗?您会发现使用YUIJQuery

等内容会更容易