PHP Parsing dengan Regex

3:39 PM | , , , , , , , ,


Kali ini saya akan berbagi tips parsing string dengan menggunakan Regex.
Apa itu Regex? Regex adalah akronim dari Regular Expression. Regex digunakan untuk membagi string berdasarkan pola dasar yg telah didefinisikan. Untuk menggunakan Regex pada PHP  dapat menggunakan fungsi preg_match() & preg_match_all().

Studi kasus saya kali ini saya ambil untuk membaca informasi dari website lain dengan menggunakan CURL kemudian saya parsing dengan mengggunakan regex.

function getLink($url){
 $curl_handle=curl_init();
 curl_setopt($curl_handle,CURLOPT_URL,$url);
 curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,0);
 curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
 $result = curl_exec($curl_handle);
 curl_close($curl_handle);

 return $result;
}
$file_contents = getLink("http://sample-site.com");
$data = array();
preg_match_all('/<div class=\"abc\">(.*?)<\/div>/s',$file_contents,$data);
foreach($data[1] as $idx=>$valx){
$detail1 = array();
preg_match_all('/<a href=\"(.*?)\"(.*?)<\/a>/s',$valx,$detail1);
$link = $detail1[1][0];
echo $link;
}

Penjelasan :
Pertama, saya mengambil isi konten dari sebuah URL website dengan menggunakan fungsi CURL. Untuk lebih memahami CURL lebih lanjut bisa dibaca di sini

Selanjutnya saya akan mendapatkan sebuah page html dengan struktur sbb:
Contoh:

<html>
   <head><title>Sample Title</title></head>
   <body>
       <div class="abc"><a href="http://google.com" title="Google">Google</a></div>
       <div class="abc"><a href="http://yahoo.com" title="Yahoo">Yahoo</a></div>
       <div class="abc"><a href="http://facebook.com" title="facebook">Facebook</a></div>
   </body>
</html>

Pada kasus ini saya hanya menginginkan mendapatkan link dari <a href>. Dengan cara konvensional (yg sebelumnya saya lakukan... :D) yakni dengan menggunakan explode secara berulang-ulang + substr atau str_replace. Namun tak cukup ampuh dan sangat ribet.

Beruntunglah saya menemukan cara regex ini dengan browsing di Internet.

Oke, saya jelaskan bagaimana Regex bekerja.

preg_match_all('/<div class=\"abc\">(.*?)<\/div>/s',$file_contents,$data);

Fungsi di atas yaitu untuk mencari string yg mengandung kata-kata di awali dengan <div class="abc" dan diakhiri dengan </div> . Sementara  (.*?)  adalah string yg ingin kita dapatkan. Tanda  "*" artinya mendapatkan karakter apapun setelah class="abc", sedangkan tanda "?" artinya boleh ada atau boleh tidak ada.

Oya perbedaan antara preg_macth() dengan preg_match_all() itu kalo preg_match() begitu mendapatkan hasil yg sesuai ekspresi yg diinginkan maka fungsi akan berhenti, sedangkan preg_match_all() akan terus mencari hasil yg sesuai sampai dengan EOF.

Dengan demikian kita akan mendapatkan array data sebagai berikut:

array(0=>array(0=>'><a href="http://google.com" title="Google">Google</a>',
1=>'><a href="http://yahoo.com" title="Yahoo">Yahoo</a>',
2=>'><a href="http://facebook.com" title="facebook">Facebook</a>'),
1=>array(0=>'><a href="http://google.com" title="Google">Google</a>',
1=>'><a href="http://yahoo.com" title="Yahoo">Yahoo</a>',
2=>'><a href="http://facebook.com" title="facebook">Facebook</a>'));

Selanjutnya dilakukan perulangan untuk mengambil hanya url yg terdapat pada link saja.
foreach($data[1] as $idx=>$valx){
$detail1 = array();
preg_match_all('/<a href=\"(.*?)\"(.*?)<\/a>/s',$valx,$detail1);
$link = $detail1[1][0];
echo $link;
}

Kode program  preg_match_all('/<a href=\"(.*?)\"(.*?)<\/a>/s',$valx,$detail1); untuk memparsing dengan diawali dengan kata-kata <a href=" dan diakhiri dengan </a>. Selanjutanya \"(.*?)\" digunakan untuk mengambil hanya yg berada pada tanda petik setelah href saja. Sehingga akan didapatkan array sbb:

array(0=>array(0=>'http://google.com',
1=>'http://yahoo.com',
2=>http://facebook.com'),
1=>array(0=>'http://google.com',
1=>'http://yahoo.com',
2=>'http://facebook.com'));

Beberapa Regular Expression yg lain
Regular ExpressionWill match...
fooThe string "foo"
^foo"foo" at the start of a string
foo$"foo" at the end of a string
^foo$"foo" when it is alone on a string
[abc]a, b, or c
[a-z]Any lowercase letter
[^A-Z]Any character that is not a uppercase letter
(gif|jpg)Matches either "gif" or "jpeg"
[a-z]+One or more lowercase letters
[0-9\.\-]Аny number, dot, or minus sign
^[a-zA-Z0-9_]{1,}$Any word of at least one letter, number or _
([wx])([yz])wy, wz, xy, or xz
[^A-Za-z0-9]Any symbol (not a number or a letter)
([A-Z]{3}|[0-9]{4})Matches three letters or four numbers

1 comments:

Unknown said...

Nice article bro, thumbs up

Post a Comment

Please leave a comment