我有一个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;这给了我不带<span></span>标记的<p>detail important</p>。
将跨度标记放在细节的“重要”部分是非常重要的。有没有什么函数可以做到这一点而不会头疼呢?
提前感谢
发布于 2011-10-30 04:27:27
我找到了问题的答案:)感谢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);发布于 2011-10-23 02:28:12
每当我需要解析HTML时,我都会通过SimpleHTMLDOM运行它:
http://simplehtmldom.sourceforge.net/
我推荐使用1.11版。由于各种原因,1.5相当糟糕。
发布于 2020-03-13 23:45:41
旧的查询,但有一个一行。操作员应该使用:
$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>
https://stackoverflow.com/questions/7861320
复制相似问题