Я пытаюсь разобрать HTML-заголовки для своих страниц и добавить идентификатор для соответствия содержимому. Мне удалось сделать это с помощью find и replace, но он не работает, когда присутствуют какие-либо дополнительные атрибуты HTML...
Heres, что в массиве заголовков, чтобы изменить
[
'find' => sprintf('<h%u>%s</h%u>', $level, $title, $level),
'replace' => sprintf('<h%u id="%s">%s</h%u>', $level, slugify($title), $title, $level),
'slug' => slugify($title)
]
Позже замена выполняется...
foreach ($parsed_content as $fix) {
$content = str_replace($fix['find'], $fix['replace'], $content);
}
Это не лучший способ сделать это, я знаю, но это был просто тест, теперь, чтобы заставить его работать правильно, я думаю, что мне просто нужно использовать регулярное выражение вместо стандартного вызова str_replace.
Я использую DOMDocument, может быть, есть альтернативный способ сделать это там?
Изменение: я пытаюсь использовать xpath для maintulate html. У меня есть простой цикл для получения данных, но я не уверен, как применить код к фактическому документу. Есть идеи? Херес, что у меня есть
$dom = new DOMDocument;
$dom->loadHTML($the_dom);
$xpath = new DOMXPath($dom);
$elements = $xpath->query('(//h1|//h2|//h3|//h4|//h5)');
foreach ($elements as $index => $element) {
$element->setAttribute('id', sanitize_title($element->textContent));
pr($element);
}
Мое предложение было бы использовать JS для этого.
Сначала установите JS-переменные с значениями переменных PHP:
var level = <?= $level ?>; // inject PHP into JS
var title = <?= $title ?>;
Затем используйте JS (или jQuery) для замены содержимого:
$("h" + level).text(title);
Я думаю, что этот способ манипулирования DOM с клиентской стороны проще, чем использование регулярного выражения с серверного языка.