HTML DOM манипулирование в PHP - PullRequest
2 голосов
/ 10 июня 2011

Интересно, как я могу манипулировать деревом 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)) {

}

Ответы [ 6 ]

4 голосов
/ 10 июня 2011

Вам не нужен 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?

2 голосов
/ 10 июня 2011

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

0 голосов
/ 16 мая 2016

Я нахожу использование встроенной в PHP реализации DOM (libxml) очень неуклюжим, поскольку он поддерживает только 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

0 голосов
/ 10 июня 2011

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

0 голосов
/ 10 июня 2011

Технически это предварительный 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 в выводе echo, чтобы помочьпредотвратить внедрение скрипта на страницу.

0 голосов
/ 10 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...