我有一个格式如下的HTML文件:
<p class="p1">subject</p>
<p class="p2">detail <span>important</span></p>
<p class="p1">subject</p>
<p class="p2">detail<span>important</span></p>
我编写了一个PHP代码来自动获取每个p1,并将其详细信息插入到我的mysql表中。
这是我的代码:
$doc = new DOMDocument();
$doc->loadHTMLFile("file.html");
$xpath = new DomXpath($doc);
$subject = $xpath->query('//p');
for ($i = 0 ; $i < $subject->length-1 ; $i ++) {
if ($subject->item($i)->getAttribute("class") == "p1")
echo $subject->item($i)->nodeValue;
}
...
这不是我的完整代码,但问题是:
echo $subject->item($i)->nodeValue;
这给了我<p>detail important</p>
,没有<span></span>
标记。
将span标签围绕细节的“重要”部分非常重要。是否有任何功能可以做到这一点而不会头痛?
提前致谢
答案 0 :(得分:1)
我找到了问题的答案:)感谢SimpleHTMLDOM
foreach($html->find('p') as $element) {
switch ($element->class) {
case 'p1':
$subject = $element;
break;
case 'p2': $detail .= html_entity_decode($element);
}
}
诀窍在于:
html_entity_decode($element);
答案 1 :(得分:0)
每当我需要解析HTML时,我都会通过SimpleHTMLDOM运行它:
http://simplehtmldom.sourceforge.net/
我建议使用1.11版。出于各种原因,1.5相当破碎。
答案 2 :(得分:0)
旧查询,但是有一个直线。 OP应该使用:
$subject = $xpath->query('//p/*');
然后:
echo $doc->saveHtml($subject->item($i));
使用*
,您将获得内部html(不包含换行段落标签);如果没有*,您将获得带有换行段落的html;
完整示例:
$html = '<div><p>ciao questa è una <b>prova</b>.</p></div>';
$dom = new DomDocument($html);
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->query('.//div/*'); // with * you get inner html without surrounding div tag; without * you get inner html with surrounding div tag
$innerHtml = $dom->saveHtml($node);
var_dump($innerHtml);
输出:<p>ciao questa è una <b>prova</b>.</p>