我正在为我的网站开发一个轻量级内联内容编辑器。与CushyCMS或SurrealCMS类似,我页面的“可编辑”元素定义为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');
答案 0 :(得分:2)
可能是DOMDocument
或simplehtmldom
的作业。
答案 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接口, 但它在服务器端的使用方面有很大的调整。