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 tersiratLIBXML_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 Kemudian elemen kontainer ini dihapus dari dokumen [tetapi
DOMElement masih ada]. Kemudian semua anak langsung dari dokumen dihapus. Ini termasuk setiap tag 5.] hapus semuanya sebelum dan sesudah penanda 6.] kembalikan Akan jauh lebih mudah jika LIBXML_HTML_NOIMPLIED bekerja untuk saya. Itu bisa, tetapi tidak. PHP 5.4.17, libxml Versi 2.7.8. ,
dan
yang ditambahkan [secara efektif opsi
LIBXML_HTML_NOIMPLIED
] serta deklarasi [\[MARK\]|\s]*?/", "[MARK]" , $new_html_piece ];
$pattern_contents = '{\[MARK\][.*?]\[\/MARK\]}is';
if [preg_match[$pattern_contents, $new_html_piece, $matches]] {
$new_html_piece = $matches[1];
}
return $new_html_piece;
Saya merasa sangat aneh, saya menggunakan parser HTML DOM dan kemudian, untuk memperbaiki "hal" ini saya harus menggunakan regex ... Intinya adalah, tidak menggunakan regex;]Chủ Đề