【问题标题】:php search and replace first element in divphp搜索并替换div中的第一个元素
【发布时间】:2011-07-17 05:14:10
【问题描述】:

我的结构是这样的

<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" > div )并将一个类添加到每个 'div' 中的第一个 'p'?

【问题讨论】:

    标签: php search html replace


    【解决方案1】:
    $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>
    

    【讨论】:

    • 代码很干净,但 OP 要求的是 PHP 解决方案而不是 js。虽然 JS 运行良好,但在某些情况下,如果 Web 用户可能没有启用 js,这并不是一个好主意。
    • @TJSherrill 请说明我在回答中使用 JavaScript 的地方。
    【解决方案2】:

    使用PHP DOMDocument对其进行遍历并添加属性:

    http://php.net/manual/en/class.domdocument.php

    http://www.php.net/manual/en/domelement.setattribute.php

    比字符串搜索更简洁。

    【讨论】:

      【解决方案3】:

      有一个库叫phpQuery:http://code.google.com/p/phpquery/

      您可以像 jQuery 一样遍历 DOM 对象:

      phpQuery::newDocument($htmlCode)->find('div.table div')->find('p:first').attr('class', 'myVal');;
      

      【讨论】:

        【解决方案4】:

        您会考虑在 javascript 中执行此操作吗?你会发现使用 YUIJQuery 之类的东西会更容易

        【讨论】:

        • 在禁用 JavaScript 的情况下可能会破坏他的布局。
        猜你喜欢
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 2010-11-07
        • 2011-09-07
        • 2017-08-09
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多