Skip Loading

Menggunakan Simple PHP DOM untuk parsing html

Ketika mengerjakan suatu project php, saya membutuhkan metoda untuk melakukan parsing html data. Beberapa skenario yang mungkin mmebutuhkan parsing html misalnya:

  • Kita ingin mendapatkan bagian tertentu saja dari data html, misalnya div dengan id tertentu
  • Mengganti/menambah css class dari element html
  • Mengganti atribut src dari tag image
  • Menambahkan atribut target='_blank' pada semua tag link, dll

PHP memiliki fungsi DOMDocument, yang merupakan xml parser dan dapat digunakan sebagai html parser. contoh pengunaaanya:

<?php
      $doc = new DOMDocument();
      $doc->loadHTML("<html><body><figure><img src=''/></figure>Test<br></body></html>");
      echo $doc->saveHTML();
?>

Namun DOMDocument ini memiliki kelemahan, yaitu tidak support tag-tag pada html 5. Sehingga bila terdapat tag html 5 seperti <figure>, <canvas> ,<navigation>, dll, akan muncul pesan warning.. Apabila kita matikan error reporting, tetap saja hasil dari $doc->saveHTML akan memberikan hasil yang tidak benar..

Metoda lain adalah menggunakan class simplehtmldom, yang dapat didownload di: http://sourceforge.net/projects/simplehtmldom/files/latest/download?source=files

Setelah download, anda cukup include file simple_html_dom.php

Apabila ingin memproses html dari file atau url, gunakan fungsi:

file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)

dan bila dari string, gunakan fungsi:

str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)

Apabila tidak ingin menghilangkan karakter newline, maka set parameter $stripRN=false.

Contoh misalkan kita ingin menampakan prefik http:// pada atribut src semua tag imag yang tidak dimulai dengan http:// sekaligus menambahkan atribut  class='img-responsive'.

Code:

<?php

require('simple_html_dom.php);

$html="<div>sometext <img src='xx.com/image1.jpg'/> 
               <img src='xx.com/image2.jpg'/>
                <img src='xx.com/image2.jpg'/><p>some text</p>
                </div>"

$doc = str_get_html($html, true, true, 'utf-8', false);
if ($doc) {
        foreach ($doc->find('img') as $element) {
               $old_src = $element->src;
               $oldclass = $element->class;
               if (0 !== strpos($old_src, 'http://')) {
                        $new_src_url = "http://" . $old_src;
                        $element->src = $new_src_url;
                }
                if (0 !== strpos($oldclass, 'img-responsive')) {
                        $element->class = $oldclass . " img-responsive";
                }
        }
       echo $doc->save();

}

?>

Cukup sederhana bukan?

www.paulussetyo.com

Related Posts
Comments ( 0 )
Add Comment

Your email address will not be published. Required fields are marked *