Я пытаюсь заменить слова из моего терминологического словаря на якорь (html), чтобы он получил всплывающую подсказку. Я сделал замену, но я не могу вернуть ее обратно в объект DomDocument.
Я сделал рекурсивную функцию, которая выполняет итерацию DOM, выполняет итерацию каждого дочернего узла, ищет слово в моем словаре и заменяет его на якорь.
Я использовал это с обычным preg_match в HTML, но это просто сталкивается с проблемами ... когда HTML становится сложным
Рекурсивная функция:
$terms = array(
'example'=>'explanation about example'
);
function iterate_html($doc, $original_doc = null)
{
global $terms;
if(is_null($original_doc)) {
self::iterate_html($doc, $doc);
}
foreach($doc->childNodes as $childnode)
{
$children = $childnode->childNodes;
if($children) {
self::iterate_html($childnode);
} else {
$regexes = '~\b' . implode('\b|\b',array_keys($terms)) . '\b~i';
$new_nodevalue = preg_replace_callback($regexes, function($matches) {
$doc = new DOMDocument();
$anchor = $doc->createElement('a', $matches[0]);
$anchor->setAttribute('class', 'text-info');
$anchor->setAttribute('data-toggle', 'tooltip');
$anchor->setAttribute('data-original-title', $terms[strtolower($matches[0])]);
return $doc->saveXML($anchor);
}, $childnode->nodeValue);
$dom = new DOMDocument();
$template = $dom->createDocumentFragment();
$template->appendXML($new_nodevalue);
$original_doc->importNode($template->childNodes, true);
$childnode->parentNode->replaceChild($template, $childnode);
}
}
}
echo iterate_html('this is just some example text.');
Я ожидаю, что результат будет:
this is just some <a class="text-info" data-toggle="tooltip" data-original-title="explanation about example">example</a> text