从php </div>中的<div>标签的内容创建数组

时间:2009-10-20 04:27:12

标签: php arrays parsing html-parsing

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

以下是$html的内容示例:

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

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

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

输出

something here
more stuff

5 个答案:

答案 0 :(得分:4)

假设这只是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将是一个包含您正在寻找的内容的数组。

有关XP SimpleXML Xpath信息,请参阅http://php.net/manual/en/simplexmlelement.xpath.php,有关XPath规范,请参阅http://www.w3.org/TR/xpath

答案 1 :(得分:2)

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";
  }
}

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

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

SimpleXML / XPath方法更简洁但如果您不想使用XPath路径(并且学习另一种技术,至少足以完成这些类型的任务),那么以上是一种程序化的替代方案。

答案 2 :(得分:0)

您可能需要使用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">
}

答案 3 :(得分:0)

没有太多可以做不到使用字符串操作函数或正则表达式。您可以使用DOM库将HTML作为XML加载并使用它遍历您的div,但如果您不小心或结构很复杂,那么这会变得很麻烦。

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

答案 4 :(得分:0)

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