Ich bin die Funktion unten, ich kämpfen , um die DOMDocument ohne es anhängt die XML, HTML, zur Ausgabe von Körper und p - Tag - Wrapper vor der Ausgabe des Inhalts. Die vorgeschlagene Lösung:
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
Funktioniert nur, wenn der Inhalt keine Elemente auf Blockebene enthält. Wenn dies jedoch der Fall ist, wie im folgenden Beispiel mit dem Element h1, wird die resultierende Ausgabe von saveXML auf ... abgeschnitten.
<p> Wenn Sie möchten </ p>
Ich wurde auf diesen Beitrag als mögliche Problemumgehung hingewiesen, kann aber nicht verstehen, wie er in diese Lösung implementiert werden kann (siehe auskommentierte Versuche unten).
Irgendwelche Vorschläge?
function rseo_decorate_keyword($postarray) {
global $post;
$keyword = "Jasmine Tea"
$content = "If you like <h1>jasmine tea</h1> you will really like it with Jasmine Tea flavors. This is the last ocurrence of the phrase jasmine tea within the content. If there are other instances of the keyword jasmine tea within the text what happens to jasmine tea."
$d = new DOMDocument();
@$d->loadHTML($content);
$x = new DOMXpath($d);
$count = $x->evaluate("count(//text()[contains(translate(., 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '$keyword') and (ancestor::b or ancestor::strong)])");
if ($count > 0) return $postarray;
$nodes = $x->query("//text()[contains(translate(., 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '$keyword') and not(ancestor::h1) and not(ancestor::h2) and not(ancestor::h3) and not(ancestor::h4) and not(ancestor::h5) and not(ancestor::h6) and not(ancestor::b) and not(ancestor::strong)]");
if ($nodes && $nodes->length) {
$node = $nodes->item(0);
// Split just before the keyword
$keynode = $node->splitText(strpos($node->textContent, $keyword));
// Split after the keyword
$node->nextSibling->splitText(strlen($keyword));
// Replace keyword with <b>keyword</b>
$replacement = $d->createElement('strong', $keynode->textContent);
$keynode->parentNode->replaceChild($replacement, $keynode);
}
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
// $postarray['post_content'] = $d->saveXML($d->getElementsByTagName('body')->item(1));
// $postarray['post_content'] = $d->saveXML($d->getElementsByTagName('body')->childNodes);
return $postarray;
}