![](/img/trans.png)
[英]In php domxpath i want to grab my full footer with html tags and text
[英]PHP's DOMXPath is stripping out my tags inside the matched text
我昨天問了這個問題,當時它正是我所需要的,但在處理一些實時數據時,我發現這並不是我所期望的那樣。 使用PHP的HTML DOMDocument解析HTML
它從HTML頁面獲取數據,但隨后它也會刪除捕獲的文本塊中的所有HTML標記,這不是我想要的。 (我可能不想拿出一些標簽,但不是全部,這可以在以后完成)
這是DOM的常見問題:如果您想獲取標簽的內容及其所有子項的內容,則必須做更多的工作。
基本上,您必須遍歷與XPath查詢匹配的子節點,以獲取其內容。
用戶在DOMElement
類的手冊頁上注明了一個解決方案 - 請參閱本說明 。
將此解決方案集成到您已有的代碼中應該為HTML字符串的聲明提供類似於此的內容,並使用子標記:
$html = <<<HTML
<div class="main">
<div class="text">
<p>
Capture this <strong>text</strong> <em>1</em>
</p>
<p>
And some other <strong>text</strong>
</p>
</div>
</div>
HTML;
並且,要從該HTML字符串中提取數據,您可以使用以下內容:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
$innerHTML = '';
// see http://fr.php.net/manual/en/class.domelement.php#86803
$children = $tag->childNodes;
foreach ($children as $child) {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($child,true));
$innerHTML .= $tmp_doc->saveHTML();
}
var_dump(trim($innerHTML));
}
唯一改變的是foreach
循環的內容:您不必僅使用$tag->nodeValue
,而是必須迭代子元素。
這給了我以下輸出:
string '<p>
Capture this <strong>text</strong> <em>1</em>
</p>
<p>
And some other <strong>text</strong>
</p>' (length=150)
這是匹配的<div>
標記的全部內容及其所有子標記 - 包括標記。
注意:手冊的用戶注釋中經常有有趣的想法和解決方案;-)
Pascal MARTIN的答案很棒,但我發現它可以簡化
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
$innerHTML = '';
$children = $tag->childNodes;
foreach ($children as $child) {
$innerHTML .= $dom->saveHTML($child);
}
var_dump(trim($innerHTML));
}
這種方式似乎產生相同的結果,但不需要在foreach
循環內創建新的DomDocument
對象。
編輯:
因此,經過進一步的實驗,您實際上可以將上述內容減少到:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
var_dump(trim($dom->saveHTML($tag)));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.