HTML DOM-манипуляция в PHP

Интересно, как я могу манипулировать деревом DOM с помощью PHP?

Я видел несколько ответов с XML DOM, которые загружаются в html-файл. Но что, если мне не нужно загружать? Что делать, если в документе, который я хочу манипулировать, есть XML DOM-скрипты?

У меня есть пример ниже, который печатает все папки. Заполните пробелы в своих ответах. Я хочу создать div-элементы с именем папки в качестве текстового узла. Ответ должен иметь некоторые XML DOM-скрипты, потому что я создам больше элементов, чем один div-элемент на моем сайте. И использование, например, echo нецелесообразно, потому что вы можете вставить элемент внутри неправильного элемента и т. Д.

$sql = " SELECT name FROM folders WHERE profileId = '$profileId' "; $result = mysql_query($sql) or die('Error6: '.mysql_error()); while($row = mysql_fetch_array($result)) { } 

Вам не нужен PHP, чтобы манипулировать домом документа, который вы уже создаете. Намного проще просто заставить PHP напрямую генерировать HTML-код. DOM там, чтобы отключить / изменить HTML, который был создан в другом месте. Другими словами, ваш скрипт будет просто:

 while($row = mysql_fetch_array($result)) { echo "<div>{$row['name']}</div>"; } 

Пример DOM, чтобы продемонстрировать утомительность

Итак, вот PHP-метод для генерации абзаца текста с некоторыми внутренними пролетами и еще много чего:

 echo "<div> This is my div, <span>There are many like it, <b>but this one</b> is</span> mine</div>"; 

Эквивалентный DOM вызывает: (не тестируется, просто для демонстрации):

 $dom = new DOM; $bold = new DOMElement('b'); $bold->appendChild(new DOMText('but this one')); $span = new DOMElement('span'); $span->appendChild(new DOMText('There are many like it,')); $span->appendChild($bold); $span->appendChild(new DOMText(' is'); $div = new DOMElement('div'); $div->appendChild(new DOMText(' This is my div,')); $div->appendChild($span); $div->appendChild(' mine'); echo $div->saveXML(); 

Так что ……. все еще использовать DOM проще, чем использовать echo ?

Для манипуляций с DOM с помощью PHP попробуйте phpQuery . Если вы знакомы с jQuery, аналогичный синтаксис делает его хорошей библиотекой для использования.

Надеюсь, я правильно понял.

 $result = mysql_query($sql) or die('Error6: '.mysql_error()); while($row = mysql_fetch_array($result)){ ?><div><?php echo $result[0]; ?></div><?php } 

Если это не то, что вы ищете, уточните свой вопрос, добавив, чего вы пытаетесь достичь.

Технически это pre DOM, поскольку вы создаете страницу в HTML до вывода ее клиенту, и в этот момент она становится объектной моделью документа в контексте клиента. Поэтому ваша DOM-манипуляция – это просто генерация HTML в PHP на стороне сервера.

 <html> <head> </head> <body> <?php $sql = " SELECT name FROM folders WHERE profileId = '".mysql_escape_string($profileId)."' "; $result = mysql_query($sql) or die('Error6: '.mysql_error()); while($row = mysql_fetch_array($result)){ echo "<div>".htmlentities($row['name'])."</div>"; } ?> </body></html> 

Я также добавил mysql_escape_string в ваш SQL-запрос, чтобы защитить от атак sql-инъекций, используя htmlentities на выходе эха, чтобы предотвратить внедрение скрипта в страницу.

Если вы думаете, что PHP создает DOM, поскольку вы эхо HTML, этого не происходит. Тем не менее, вы можете использовать образцы Marc B для создания узлов DOM (к которым вы можете добавить). После того как вы обработали этот узел, вы можете затем эхо-узлы HTML, используя http://www.php.net/manual/en/domdocument.savehtml.php

Я считаю, что использование встроенной реализации DOM (libxml) PHP очень неудобно из-за того, что она поддерживает только DOM 2. Я предпочитаю использовать phpgt / dom ( https://github.com/phpgt/dom ), доступный через композитор .

Пример использования:

 $document = new \phpgt\dom\HTMLDocument( "<!doctype html><h1>My list of amazing things</h1> <ul class='my-list'></ul>" ); $result = $database->query("SELECT thing FROM Amazing"); $ul_output = $document->querySelector("ul.my-list"); foreach($result as $row) { $li = $document->createElement("li"); $li->textContent = $row["thing"]; $ul_output->appendChild($li); } echo $document->saveHTML(); 

Полная документация доступна в викторине проекта Github: https://github.com/phpgt/dom/wiki