Удалить абзац по id с помощью php Dom - PullRequest
1 голос
/ 10 января 2012

Я пытаюсь найти абзацы с идентификатором "test" и удалить их из html-строки, я пытался использовать php Dom Document, но html, который я ищу, плохо сформирован, и я получаю ошибки

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
$doc->loadHTMLFile($caption);
$xmessage = $doc->getElementById('test');

возвращает предупреждение: DOMDocument :: loadHTML () [domdocument.loadhtml]: неожиданный конечный тег: br i

Есть ли способ подавления предупреждений?Спасибо

Ответы [ 4 ]

4 голосов
/ 10 января 2012

Вы можете использовать следующий код для удаления пункта с id='test':

$caption = "blah blah<p id='test'>Test message</p><p id='foo'>Foo Bar</p>";
$doc = new DOMDocument();
$doc->loadHTML($caption);
$xpath = new DOMXPath($doc);
$nlist = $xpath->query("//p[@id='test']");
$node = $nlist->item(0);
echo "Para: [" . $node->nodeValue . "]\n";
$node->parentNode->removeChild($node);
echo "Remaining: [" . $doc->saveHTML() . "]\n";

ВЫВОД:

Para: [Test message]
Remaining: [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>blah blah</p>
<p id="foo">Foo Bar</p>
</body></html>
]
3 голосов
/ 10 января 2012

Не использовать loadHTMLFile() использовать loadHTML().

Последний ожидает строку HTML, которую вы предоставляете. Это должно исправить предупреждение.

1 голос
/ 10 января 2012

getElementById требует, чтобы HTML был проверен , прежде чем он заработает.См. этот ответ StackOverflow для получения дополнительной информации.

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument;
$doc->validateOnParse = true;  // validate HTML
$doc->loadHTML($caption);  // This loads an HTML string
$xmessage = $doc->getElementById('test');

(ПРИМЕЧАНИЕ. Вам необходимо использовать loadHTML, а не loadHTMLFile).

Это все еще может не работать, так как HTML может быть недействительным.

Если это не работает, я предлагаю использовать DOMXPath .

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument;
$doc->loadHTMLFile($caption);
$xpath = new DOMXPath($doc);
$xmessage = $xpath->query("//p[@id='test']")->item(0);
0 голосов
/ 10 января 2012

Есть несколько абзацев с одинаковым идентификатором? Конечно, нет ...

Как правило, это плохая практика (поскольку предупреждения существуют по определенной причине), но вы можете подавить предупреждения, используя @, хотя я не уверен на 100%, что он работает с вызовами функций из такого класса, дайте мне знать, если это делает!

$caption = "blah blah<p id ='test'>Test message</p>";
$doc = new DOMDocument();
@$doc->loadHTMLFile($caption);
$xmessage = @$doc->getElementById('test');
...