簡體   English   中英

PHP 中的 HTML DOM 操作

[英]HTML DOM manipulation in PHP

我想知道如何使用 PHP 操作 DOM 樹?

我在 html 文件中加載了 XML DOM 的一些答案。 但是如果我不需要加載呢? 如果我要操作的文檔中有 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 來操作您已經生成的文檔的 dom。 讓 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更容易嗎?

對於 PHP 驅動的 DOM 操作,請嘗試phpQuery 如果您熟悉 jQuery,類似的語法使其成為一個很好的庫。

我發現使用 PHP 的內置 DOM 實現 (libxml) 非常笨拙,因為它只支持 DOM 2。我更喜歡使用通過composer 獲得的 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 wiki 上提供了完整文檔: https://github.com/phpgt/dom/wiki

我希望我理解正確。

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

如果這不是您所尋求的,請通過添加您想要實現的目標來詳細說明您的問題。

從技術上講,這是前 DOM,因為您在將頁面輸出到客戶端之前在 HTML 中構建頁面,此時它在客戶端的上下文中變為文檔 object model。 因此,您的 DOM 操作實際上只是服務器端 PHP 中的 HTML 生成。

<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>

我還在您的 sql 語句中添加了 mysql_escape_string 以幫助防止 sql 注入攻擊,同時在 echo output 上使用 htmlentities 以幫助防止腳本注入頁面。

如果您認為 PHP 在您回顯 HTML 時會創建一個 DOM,那不會發生。 但是,您可以使用 Marc B 示例來生成 DOM 節點(您可以使用 append 來)。 操作該節點后,您可以使用http://www.php.net/manual/en/domdocument.savehtml.php回顯節點 HTML

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM