Saya menggunakan preg_match_all untuk mengambil semua skrip dan menempatkannya sebelum body end seperti di bawah ini:

preg_match_all('#(<script.*?</script>)#is', $html, $matches);
$js = '';
foreach ($matches[0] as $value):
    $js .= $value;
endforeach;
$html = preg_replace('#(<script.*?</script>)#is', '', $html);
$html = preg_replace('#</body>#',$js.'</body>',$html);

Ini telah merusak beberapa fungsi pada halaman namun untuk beberapa skrip seperti di bawah ini:

<script data-template="bundle-summary" type="text/x-magento-template">
      <li>
            <strong class="label"><%- data._label_ %>:</strong>
            <div data-container="options"></div>
      </li>
</script>

Bagaimana saya bisa menggunakan preg_match_all untuk mengecualikan skrip <script data-template agar tidak dipindahkan.

Saya pikir saya dapat memeriksa apakah skrip x-magento-template skrip dengan melakukan sesuatu seperti di bawah ini:

if (strpos($value, 'type="text/x-magento-template"') === false) {
    $js .= $value;
}

Maka itu tidak akan ditambahkan ke variabel $js namun saya tidak yakin bagaimana cara menghentikan skrip yang sama dihapus di baris di bawah ini:

$html = preg_replace('#(<script.*?</script>)#is', '', $html);

Saya perlu mengganti semua skrip namun tidak jika mengandung type="text/x-magento-template

Perbarui

Saya melakukan hal di bawah ini tetapi saya bertanya-tanya apakah ada cara yang lebih efisien untuk melakukan ini dengan preg_match_all?

            preg_match_all('#(<script.*?</script>)#is', $html, $matches);
            $js = '';
            foreach ($matches[0] as $value):
                if (strpos($value, 'type="text/x-magento-template"') === false) {
                    $js .= $value;
                    $html = str_replace($value, '', $html);
                }
            endforeach;
            //$html = preg_replace('#(<script.*?</script>)#is', '', $html);
            $html = preg_replace('#</body>#',$js.'</body>',$html);

Setelah menentukan waktu, perbedaan antara metode dengan pernyataan if dan bukan perbedaannya dapat diabaikan dengan waktu masing-masing sekitar 0,005 detik, jadi saya senang untuk meninggalkannya.

0
harri 15 Januari 2018, 17:23

1 menjawab

Jawaban Terbaik

Untuk pengeditan html, pendekatan DOM memberikan hasil yang lebih baik:

$dom = new DOMDocument;
$state = libxml_use_internal_errors(true);
$dom->loadHTML($html); // or $dom->loadHTMLFile('./file.html'); 

$removeList=[];
$bodyNode = $dom->getElementsByTagName('body')->item(0);

foreach ($dom->getElementsByTagName('script') as $scriptNode) {
    if ( $scriptNode->hasAttribute('type') && $scriptNode->getAttribute('type')=='text/x-magento-template' )
        continue;

    $removeList[] = $scriptNode;
}

foreach ($removeList as $scriptNode) {
    $bodyNode->appendChild($scriptNode);
}

libxml_use_internal_errors($state);

echo $dom->saveHTML();

Dengan kode ini Anda tidak perlu menghapus node skrip karena node tersebut berpindah dari posisinya saat ini di pohon dom ke akhir elemen body (karena ditambahkan).

1
Casimir et Hippolyte 15 Januari 2018, 15:22