ฉันเป็นฟังก์ชั่นด้านล่างฉันกำลังดิ้นรนเพื่อส่งออก DOMDocument โดยที่ไม่ต้องต่อท้าย XML, HTML, bodyและp tag ก่อนผลลัพธ์ของเนื้อหา การแก้ไขที่แนะนำ:
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
ใช้งานได้เฉพาะเมื่อเนื้อหาไม่มีองค์ประกอบระดับบล็อกอยู่ภายใน อย่างไรก็ตามเมื่อเป็นเช่นนั้นดังตัวอย่างด้านล่างพร้อมกับองค์ประกอบ h1 ผลลัพธ์ที่ได้จาก saveXML จะถูกตัดทอนเป็น ...
<p> ถ้าคุณชอบ </p>
ฉันถูกชี้ไปที่โพสต์นี้ว่าเป็นวิธีแก้ปัญหาที่เป็นไปได้ แต่ฉันไม่เข้าใจวิธีการนำไปใช้ในโซลูชันนี้ (ดูความคิดเห็นในความพยายามด้านล่าง)
ข้อเสนอแนะใด ๆ ?
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;
}