3

我将网页的内容分配给了一个变量$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
4

5 回答 5

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将是一个包含您要查找的内容的数组。

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

于 2009-10-20T04:38:58.870 回答
2

PHP 有多种处理 HTML 的方法,包括DomDocumentSimpleXML. 请参阅使用 PHP 和 DOM 解析 HTML。这是一个例子:

$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 路线(并学习另一种技术,至少足以完成此类任务),那么上述方法是一种编程替代方案。

于 2009-10-20T04:47:19.580 回答
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">
}
于 2009-10-20T04:30:45.777 回答
0

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

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

于 2009-10-20T04:36:33.133 回答
0

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

于 2009-10-20T04:38:12.193 回答