Penggunaan fungsi GETELEMENTBYTAG pada PHP

Sekalian saya upload juga karya Ibnu Daqiqil Ied, M.Ti. tentang Mengenal dan mamahami Codeigniter 2. sangat disarankan sebelum membaca ebook ini, anda harus memahami dulu OOP di PHP, sebab CI [singkatan dari Codeigniter] menggunakan sistem pemrograman modular, yang itu adanya di OOP PHP. Jangan berkecil hati. Orang lain menciptakan, kita hanya mempelajari dan memahami. Pasti bisa!. Semangat Coding...!

Saya fungsi di bawah ini, saya berjuang untuk menampilkan DOMDocument tanpa menambahkan XML, HTML, body dan p tag sebelum pembungkus konten. Perbaikan yang disarankan:

$postarray['post_content'] = $d->saveXML[$d->getElementsByTagName['p']->item[0]];

Hanya berfungsi ketika konten tidak memiliki elemen level blok di dalamnya. Namun, ketika itu terjadi, seperti pada contoh di bawah ini dengan elemen h2, output yang dihasilkan dari saveXML dipotong ke ...

Jika Anda suka

Saya telah menunjuk posting ini sebagai solusi yang mungkin, tetapi saya tidak dapat memahami bagaimana mengimplementasikannya ke dalam solusi ini [lihat upaya yang dikomentari di bawah].

Ada saran?

function rseo_decorate_keyword[$postarray] {
    global $post;
    $keyword = "Jasmine Tea"
    $content = "If you like 

jasmine tea

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::h2] 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 keyword $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; }

Semua jawaban ini sekarang salah, karena pada PHP 5.4 dan Libxml 2.6 loadHTML sekarang memiliki parameter $option yang memerintahkan Libxml tentang bagaimana seharusnya mem-parsing konten.

Karenanya, jika kita memuat HTML dengan opsi ini

$html->loadHTML[$content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD];

ketika melakukan saveHTML[] tidak akan ada doctype, tidak ada , dan tidak ada .

LIBXML_HTML_NOIMPLIED mematikan penambahan otomatis elemen html/tubuh yang tersirat LIBXML_HTML_NODEFDTD mencegah doctype default ditambahkan ketika tidak ditemukan.

Dokumentasi lengkap tentang parameter Libxml adalah di sini

[Perhatikan bahwa dokumen loadHTML mengatakan bahwa Libxml 2.6 diperlukan, tetapi LIBXML_HTML_NODEFDTD hanya tersedia di Libxml 2.7.8 dan LIBXML_HTML_NOIMPLIED tersedia di Libxml 2.7.7]

Hapus saja node secara langsung setelah memuat dokumen dengan loadHTML []: 

# remove removeChild[$doc->doctype];           

# remove  
$doc->replaceChild[$doc->firstChild->firstChild->firstChild, $doc->firstChild];

Gunakan saveXML[] sebagai gantinya, dan kirimkan documentElement sebagai argumen untuk itu.

$innerHTML = '';
foreach [$document->getElementsByTagName['p']->item[0]->childNodes as $child] {
    $innerHTML .= $document->saveXML[$child];
}
echo $innerHTML;

//php.net/domdocument.savexml

Trik yang rapi adalah dengan menggunakan loadXML dan kemudian saveHTML . Tag html dan body dimasukkan pada tahap load, bukan pada tahap save.

$dom = new DOMDocument;
$dom->loadXML['

My DOMDocument contents are here

']; echo $dom->saveHTML[];

NB bahwa ini sedikit hacky dan Anda harus menggunakan jawaban Jonah jika Anda bisa membuatnya bekerja.

gunakan DOMDocumentFragment

$html = 'what you want';
$doc = new DomDocument[];
$fragment = $doc->createDocumentFragment[];
$fragment->appendXML[$html];
$doc->appendChild[$fragment];
echo $doc->saveHTML[];

Saya agak terlambat di klub tetapi tidak ingin tidak berbagi metode yang saya ketahui. Pertama-tama saya mendapatkan versi yang tepat untuk loadHTML [] untuk menerima opsi-opsi bagus ini, tetapi LIBXML_HTML_NOIMPLIED tidak berfungsi pada sistem saya. Pengguna juga melaporkan masalah dengan parser [misalnya sini dan sini ].

Solusi yang saya buat sebenarnya cukup sederhana.

HTML yang akan dimuat dimasukkan ke dalam elemen

sehingga memiliki wadah berisi semua node untuk dimuat.

Kemudian elemen kontainer ini dihapus dari dokumen [tetapi DOMElement masih ada].

Kemudian semua anak langsung dari dokumen dihapus. Ini termasuk setiap tag , dan yang ditambahkan [secara efektif opsi LIBXML_HTML_NOIMPLIED] serta deklarasi [\[MARK\]|\s]*?/", "[MARK]" , $new_html_piece ];

5.] hapus semuanya sebelum dan sesudah penanda

$pattern_contents = '{\[MARK\][.*?]\[\/MARK\]}is';
if [preg_match[$pattern_contents, $new_html_piece, $matches]] {
    $new_html_piece = $matches[1];
}

6.] kembalikan

return $new_html_piece;

Akan jauh lebih mudah jika LIBXML_HTML_NOIMPLIED bekerja untuk saya. Itu bisa, tetapi tidak. PHP 5.4.17, libxml Versi 2.7.8. 
Saya merasa sangat aneh, saya menggunakan parser HTML DOM dan kemudian, untuk memperbaiki "hal" ini saya harus menggunakan regex ... Intinya adalah, tidak menggunakan regex;]

Bài mới nhất

Chủ Đề