Используйте PHP для поиска и замены содержимого html-элемента с заданным именем класса в документе

#php #json

#php #json

Вопрос:

Я работаю над легким встроенным редактором контента для своего сайта. Подобно CushyCMS или SurrealCMS, «редактируемые» элементы моей страницы определяются с class="editable" помощью .

Я хотел бы передать 2 переменные в php через AJAX:

$page Документ, в который нужно записать (например. ‘/path/index.html ‘)

$json Строка json: {"0":"First Content","1":"Second Content","2":"Third Content"} где ключ — это индекс всех элементов с class="editable" , а значение — это innerHTML каждого элемента.

Как я могу открывать $page и находить / заменять элементы в PHP 5.3 class="editable" ?

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

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

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

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

echo ('Success');
  

Комментарии:

1. Что теперь выводит ваш цикл for? Кроме того, я бы не просто «echo (‘success’)», я бы сделал, если (fwrite($ fp, $ html)) echo ‘success’;

2. Спасибо за подсказку echo! Прямо сейчас я вхожу Parse error: syntax error, unexpected ')' в курс foreach ($ret[$i]) { дела .

3. О, да. Это не синтаксис foreach . Я дам ответ ниже.

Ответ №1:

Вы можете использовать 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"  amp; 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');
  

Комментарии:

1. nodeValue похоже, преобразует мои html-теги в обычный текст. Можно ли в любом случае сохранить его как innerHTML?

2. @Josiah: Я улучшил for цикл из-за недавнего открытия, что старый код обрабатывал только правильно сформированный XHTML, но HTML. Теперь у него не должно быть проблем ни с тем, ни с другим.

Ответ №2:

Вероятно, задание для DOMDocument или simplehtmldom .

Комментарии:

1. У вас есть пример? Я новичок в PHP :). Спасибо!

Ответ №3:

Для этого вам не нужен цикл foreach, если цикл for предоставляет индексы. Попробуйте это:

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

Ответ №4:

Вы можете использовать QueryPath, библиотеку PHP для работы с XML и HTML. Как jQuery для PHP.

С их сайта:

QueryPath — это библиотека PHP для работы с XML и HTML. Он предназначен для работы не только с локальными файлами, но и с веб-сервисами и ресурсами базы данных. Он реализует большую часть интерфейса jQuery, но он сильно настроен для использования на стороне сервера.