【问题标题】:Create array from the contents of <div> tags in php从 php 中的 <div> 标签的内容创建数组
【发布时间】:2010-12-08 05:24:02
【问题描述】:

我将网页的内容分配给变量$html

下面是$html的内容示例:

<div class="content">something here</div>
<span>something random thrown in <strong>here</strong></span>
<div class="content">more stuff</div>

我如何使用 PHP 创建一个数组,从中找到 &lt;div class="content"&gt;&lt;/div&gt; 区域的内容,如下所示(对于上面的示例),所以:

echo $array[0] . "\n" . $array[1]; //etc

输出

something here
more stuff

【问题讨论】:

    标签: php arrays parsing html-parsing


    【解决方案1】:

    PHP 有多种处理 HTML 的方法,包括 DomDocumentSimpleXML。见Parse HTML With PHP And DOM。这是一个例子:

    $dom = new DomDocument; 
    $dom->loadHTML($html); 
    $dom->preserveWhiteSpace = false; 
    $divs = $dom->getElementsByTagName('div'); 
    foreach ($divs as $div) {
      $class = $div->getAttribute('class');
      if ($class == 'content') {
        echo $div->nodeValue . "\n";
      }
    }
    

    从技术上讲,类属性可以是多个类,因此您可能想要使用:

    $classes = explode(' ', $class);
    if (in_array('content', $classes)) {
      ...
    }
    

    SimpleXML/XPath 方法更简洁,但如果您不想走 XPath 路线(并学习另一种技术,至少足以完成此类任务),那么上述方法是一种编程替代方案。

    【讨论】:

      【解决方案2】:

      假设这只是 OP 中的一个简化案例,而实际情况更复杂,您会想要使用 XPath。

      如果它真的很复杂,那么您可能想要使用DOMDocument(和DOMXPath),但这里有一个使用 SimpleXML 的简单示例

      $xml = new SimpleXMLElement($html);
      
      $result = $xml->xpath('//div[@class="content"]');
      
      while(list( , $node) = each($result)) {
          echo $node,"\n";
      }
      

      由于您明确询问要为此创建一个数组,您可以使用:

      $res_Arr = array();
      while(list( , $node) = each($result)) {
          $res_Arr[] = $node;
      }
      

      $res_Arr 将是一个包含您要查找的内容的数组。

      请参阅http://php.net/manual/en/simplexmlelement.xpath.php 了解 php SimpleXML Xpath 信息和http://www.w3.org/TR/xpath 了解 XPath 规范

      【讨论】:

      • 哎呀,您甚至可以使用XSLTransform 直接获取输出!但这当然会让你完全摆脱 PHP...
      【解决方案3】:

      你可能需要使用preg_match_all()

      $matches = array();
      preg_match_all('`\<div(.*?)class\=\"content\"(.*?)\>(.*?)\<\/div\>`iUsm',$html,$matches,PREG_SET_ORDER);
      foreach($matches as $m){
        // $m[3] represents the content in <div class="content">
      }
      

      【讨论】:

      • -1 处理服务器端 HTML 的正则表达式是一个糟糕的建议。
      • 如果 xml 在divclass 之间包含两个空格,或者一个额外的id 字段,会发生什么情况?如果发现这个解决方案相当脆弱。
      • 根据任务的不同,这是足够好的解决方案。将 HTML 转换为 XML 也有其陷阱。
      • 谁说过将 HTML 转换为 XML?与正则表达式相比,处理 HTML DOM 的“陷阱”远少,对于这项任务来说,这只不过是一种肮脏的 hack。
      【解决方案4】:

      看起来 Kalem13 击败了我,但我同意。您可以使用 DOMDocument 类。我没有亲自使用它,但我认为它对你有用。首先实例化一个 DOMDocument 对象,然后使用 loadHTML() 函数加载 $html 变量。然后就可以使用getElementsByTagName()函数了。

      【讨论】:

        【解决方案5】:

        除了使用字符串操作函数或正则表达式之外,您无能为力。您可以使用 DOM 库将 HTML 加载为 XML 并使用它来遍历您的 div,但如果您不小心或结构复杂,这可能会变得很麻烦。

        http://ca3.php.net/manual/en/book.dom.php

        【讨论】:

        • '可以','麻烦',......积极思考,伙计!每个问题都有解决方案!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 2011-06-27
        • 2013-01-16
        • 1970-01-01
        • 2020-01-13
        • 2013-01-31
        相关资源
        最近更新 更多