使用PHP查找和替换文档中给定类名的html元素内容

时间:2011-10-08 17:32:05

标签: php json

我正在为我的网站开发一个轻量级内联内容编辑器。与CushyCMSSurrealCMS类似,我页面的“可编辑”元素定义为class="editable"

我想通过AJAX将2个变量传递给php:

$page要写入的文件(例如'/path/index.html')

$json一个json字符串:{"0":"First Content","1":"Second Content","2":"Third Content"}其中键是class="editable"所有元素的索引,值是每个元素的innerHTML。

在PHP 5.3中,如何打开$page并查找/替换class="editable"元素?

$page = $_POST['page'];
$json = $_POST['json'];

$doc = new DOMDocument();
$doc = DOMDocument::loadHTMLFile($page);

// Detect DOM elements with class="editable"  & replace content with JSON data

// Save changes to designated file
$doc->saveHTMLFile($page); // Write to file eg, 'index.html'

echo ('Success');

4 个答案:

答案 0 :(得分:2)

可能是DOMDocumentsimplehtmldom的作业。

答案 1 :(得分:2)

您可以使用XPath跟踪DOM中的所有可编辑元素。

$xpath = new DOMXPath($doc);
$entries = $xpath->query('//*[@class="editable"]');
$edits = json_decode($json, true);
$num_edits = count($edits);

for($i=0; $i<$num_edits; $i++)
{
    $f = new DOMDocument();
    $edit = mb_convert_encoding($edits[$i], 'HTML-ENTITIES', "UTF-8"); 
    $f->loadHTML($edit);
    $node = $f->documentElement->firstChild;
    $entries->item($i)->nodeValue = "";
    foreach($node->childNodes as $child) {
        $entries->item($i)->appendChild($doc->importNode($child, true));
    }
}

这里再次出现在原始代码的上下文中:

$page = $_POST['page'];
$json = $_POST['json'];

$doc = new DOMDocument();
$doc = DOMDocument::loadHTMLFile($page);

// Detect DOM elements with class="editable"  & replace content with JSON data
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//*[@class="editable"]');
$edits = json_decode($json, true);
$num_edits = count($edits);

for($i=0; $i<$num_edits; $i++)
{
    $f = new DOMDocument();
    $edit = mb_convert_encoding($edits[$i], 'HTML-ENTITIES', "UTF-8"); 
    $f->loadHTML($edit);
    $node = $f->documentElement->firstChild;
    $entries->item($i)->nodeValue = "";
    foreach($node->childNodes as $child) {
        $entries->item($i)->appendChild($doc->importNode($child, true));
    }
}

// Save changes to designated file
$doc->saveHTMLFile($page); // Write to file eg, 'index.html'

echo ('Success');

答案 2 :(得分:0)

如果for循环提供索引,则不需要foreach循环。试试这个:

// Write JSON content to class="editable" elements
for ($i = 0; $i < $ret->length; $i++) {
        echo $data[$i];
}

答案 3 :(得分:0)

您可以使用QueryPath,一个用于处理XML和HTML的PHP​​库。就像jQuery for PHP。

从他们的网站:

  

QueryPath是一个用于操作XML和HTML的PHP​​库。它是   旨在不仅适用于本地文件,还适用于Web服务   和数据库资源。它实现了很多jQuery接口,   但它在服务器端的使用方面有很大的调整。