Regex
Regex
Regex
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Beriklan?
Jadi Penulis?
Tentang Kami
Haqqi
Like 1
Informasi Tutorial
Program Versi Tingkat Kesulitan Estimasi Waktu PHP 5.3+ Pemula - Standar 60 menit
Sebuah teknik untuk mendeteksi pola pada sebuah string. Mendeteksi suatu pola dari sebuah string atau kumpulan karakter bisa dengan berbagai macam cara. Misalnya, untuk mencari apakah string xyz ada dalam string abcdefgxyzabc, cara paling sederhana adalah melakukan perulangan dari awal sampai akhir hingga mengeluarkan hasil apakah ditemukan atau tidak. Artikel ini pernah dipublikasikan oleh Penulis di majalah PC Media edisi 04/2011 lalu. Cara lain adalah menggunakan fungsi strstr() atau strpos() yang akan mengembalikan nilai integer berupa index lokasi pola yang ditemukan. Jika dibuat dalam bahasa pemrograman PHP sederhana,
1 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
bisa ditulis:
1 2 3 4 5 6 7 8 9 10 $string = 'abcdefgxyzabc'; $pattern = 'xyz'; if(($location = strpos($string, $pattern))) { echo $location; } echo '<br />'; if(($location = strstr($string, $pattern))) { echo $location; } ?
Tapi cara tersebut hanya berfungsi untuk string yang sama, bukan sebuah pola. Bagaimana untuk mencari pola sebuah alamat email? Kasus ini akan cukup rumit dikerjakan bila menggunakan cara perulangan ataupun dengan fungsi di atas. Algoritmanya, perlu dicari apakah hanya ada satu karakter @. Sebelum karakter tersebut, perlu dideteksi apakah terdapat karakter yang tidak diperbolehkan dalam format email atau tidak. Setelah karakter tersebut, perlu dicari apakah ada sebuah titik yang di sebelah kanannya ada satu atau lebih karakter berupa huruf.
Untuk lebih jelasnya coba Anda lihat gambar 1. Sebuah alamat email valid harus (1) diawali minimal 1 karakter yang diperbolehkan, (2) setelah itu sebuah karakter @ (tidak boleh lebih dari satu), diikuti nama domain yang (3) minimal ada 1 karakter, dan diakhiri (4) sebuah titik yang diikuti (5) minimal sebuah karakter. Cukup rumit bukan bila dikerjakan dengan if-else dan fungsi strpos() saja?
Regex
Berbagai macam pencarian pola sebenarnya dapat diselesaikan dengan cepat menggunakan apa yang disebut dengan Regex. Regex merupakan singkatan dari Regular Expression, yaitu sebuah metode untuk mencari suatu pola dalam sebuah string. Regex sendiri sebenarnya juga merupakan string. Hanya saja karakter dalam string tersebut diterjemahkan sebagai suatu pola dan aturan tertentu. Misalkan, string yang diawali oleh tanda caping ^ berarti string tersebut harus diawali oleh karakter yang mengikuti tanda caping tersebut. Syntax regex pada setiap bahasa pemrograman berbeda-beda. Dalam PHP, awalnya dikenal fungsi ereg(), eregi(), ereg_replace(), dan eregi_replace(), untuk memanfaatkan regex ini. Namun fungsifungsi tersebut sudah tidak dapat digunakan lagi sejak PHP versi 5.3.0 karena sudah diimplementasikan lagi fungsi yang lebih baik lagi. Saat ini Anda bisa menggunakan fungsi preg_match() untuk menggunakan regex. Fungsi lainnya yang tersedia adalah preg_replace(), preg_filter(), preg_match_all(), dan preg_split(). Semuanya terletak dalam library pcre.php. PCRE adalah singkatan dari Perl Compatible Regular Expression,
2 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
yang artinya regex ini dapat digunakan pula pada bahasa pemrograman Perl. Untuk lebih lengkapnya, Anda bisa mempelajari dokumentasi di website resminya. Secara default, pola yang akan dicari harus diawali dan diakhiri oleh karakter garis miring (slash) yang berfungsi sebagai delimeter. Contoh Regex paling sederhana untuk mencari apakah ada pola fgh dalam string abcdefghijk sebagai berikut.
1 2 3 4 5 6 7 8 <?php $string = 'abcdefghijk'; if(preg_match("/fgh/", $string)) { echo 'String berisi pola fgh'; } else { echo 'Tidak ada pola fgh dalam string'; } ?> ?
Berikut ini adalah beberapa aturan regex sebagai dasar pembuatan regex lebih lanjut. Penulis telah membuat tutorial yang lebih sederhana tentang pengenalan Regex ini di blog milik Penulis. Untuk lebih lengkapnya, klik link ini.
Karakter Awal
Untuk mencari pola berawalan suatu string, maka regex yang digunakan adalah karakter caping ^. Contohnya, apakah string berawalan abc maka regex-nya adalah sebagai berikut.
1 2 3 4 5 6 7 8 <?php $string = 'abcdefghijk'; if(preg_match("/^abc/", $string)) { echo 'String berawalan abc'; } else { echo 'Tidak berawalan abc'; } ?> ?
Tanda caping yang diikuti karakter abc berarti bahwa string harus berawalan dengan abc. Sedangkan tanda slash berikutnya menandakan bahwa karakter setelahnya tidak perlu dihiraukan.
Case-Sensitive
Namun regex tersebut tidak berlaku jika satu atau lebih karakter abc pada awal string yang akan dicari merupakan huruf kapital. Terkadang Anda hanya perlu mencari pola karakter tersebut, tanpa memperhitungkan besar kecilnya. Untuk tidak menghiraukan case sensitivity, Anda bisa menambahkan delimeter /i di belakang regex, menjadi seperti berikut.
1 2 3 4 5 6 7 8 <?php $string = 'abcdefghijk'; if(preg_match("/^ABC/i", $string)) { echo 'String berawalan abc'; } else { echo 'Tidak berawalan abc'; } ?> ?
Dengan demikian, kapital atau tidaknya pola yang dicari tidak akan berpengaruh.
3 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Karakter Akhir
Berikutnya adalah mencari string dengan akhir berupa pola tertentu. Untuk mencari pola di akhir sebuah string, ada 2 cara. Cara pertama adalah menggunakan tanda dolar $. Namun cara ini memiliki sebuah celah kecil untuk timbul suatu bug dalam program Anda jika tidak digunakan secara benar. Sebab tanda dolar memasukkan endline \n ke dalam pola yang dicari, sehingga bila mencari pola xyz dalam string abcxyz dan abcxyz\n akan menghasilkan nilai yang sama-sama benar. Untuk tidak memasukkan endline dalam pola, Anda bisa menggunakan regex backslash z \z. Contoh penggunaannya sebagai berikut.
1 2 3 4 5 6 7 8 <?php $string = 'abc123xyz'; if(preg_match("/xyz\z/i", $string)) { echo 'Pola berakhiran xyz ditemukan'; } else { echo 'Pola tidak ditemukan'; } ?> ?
Ingat kembali bahwa /i hanya menandakan bahwa regex tersebut case insensitive. Karakter awal dari string juga tidak akan dihiraukan selama string tersebut memiliki akhiran yang sesuai.
Meta Characters
Untuk pencarian pola yang mengandung karakter meta, perlu diberikan perlakuan tersendiri. Karakter meta adalah karakter yang digunakan sebagai penanda Regex. Seperti contoh sebelumnya, salah satu contoh karakter meta adalah ^ dan $. Selain itu, beberapa karakter lainnya adalah titik ., asterik *, plus +, tanda tanya ?, seluruh jenis tanda kurung, pipe |, dan backslash \. Karena merupakan karakter meta, karakter ini tidak akan dibaca sebagai pola, melainkan hanya sebuah tanda operasi. Untuk memasukkannya sebagai karakter yang dicari dalam pola, Anda harus menambahkan karakter backslash \ sebelum karakter meta. Backslash disebut juga sebagai escape character. Sebagai contoh, jika mencari pola 2+7 dalam sebuah string, maka bisa ditulis sebagai berikut.
1 2 3 4 5 6 7 8 9 <?php $string = '2+7=9'; if(preg_match("/^2\+7/i", $string)) { echo 'Pola 2+7 ditemukan'; } else { echo 'Tidak ditemukan'; } ?> ?
Perhatikan bahwa sebelum tanda tambah disertakan pula tanda backslash. Hal ini juga berlaku untuk semua karakter meta. Pengecualian untuk karakter backslash sendiri karena escape karakter juga perlu di-escape juga, untuk memasukkan pola backslash pada regex, maka harus diulang 4 kali menjadi \\\\.
4 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Kurung Siku
Karakter kurung siku [] merupakan regex untuk menyatakan kelas karakter, yaitu kumpulan karakter yang diinginkan. Karakter tersebut dapat dituliskan [abcdefg] atau dengan dash [a-g] khusus untuk karakter yang berurutan. Untuk melihat apa saja karakter yang sesuai, Anda bisa menggunakan fungsi preg_match_all() dan memasukkan parameter ketiga berupa variable yang nantinya akan menyimpan sub-string apa saja yang sesuai dengan pola yang ditentukan.
1 2 3 4 5 6 7 8 9 <?php $string = 'abcefghijklmnopqrstuvwxyz0123456789'; preg_match_all("/[af]/", $string, $matches); foreach($matches[0] as $value) { echo $value . '<br />'; } ?> ?
Hampir semua karakter meta tidak akan berfungsi sebagai karakter meta jika di dalam kurung siku ini, melainkan hanya menjadi karakter biasa. Sehingga bila ingin mencari pola yang mengandung huruf a, b, c, dan $, maka cukup menuliskannya [abc$] saja, tanpa escape character. Pengecualian untuk karakter caping ^. Jika diletakkan di awal kurung, itu berarti bahwa yang dicari adalah karakter yang bukan dalam kurung siku tersebut. Sebagai contoh, jika ingin mencari pola selain huruf bgjk dalam string, maka harus ditulis sebagai berikut.
1 2 3 4 5 6 7 8 9 <?php $string = 'abcefghijklmnopqrs'; preg_match_all("/[^bgjk]/", $string, $matches); foreach($matches[0] as $value) { echo $value . '<br />'; } ?> ?
Titik
Titik juga merupakan karakter meta yang berarti akan mengembalikan nilai true untuk semua karakter selain line break (\r dan \n), namun hanya satu karakter. Contohnya adalah sebagai berikut.
1 2 3 4 5 6 7 8 <?php $string = 'helo hilo h lo hxlo hbelo'; if(preg_match_all("/h.lo/", $string, $match)) { foreach($match[0] as $m) { echo $m . '<br />'; } } ?> ?
Program tersebut akan mencetak kata helo, hilo, h lo, dan hxlo, tanpa kata terakhir. Untuk memasukkan line break dalam aturan, Anda harus memberikan flag \s di akhir regex, sama seperti cara penulisan case insensitive.
5 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Tanda bintang * dan tambah + memiliki arti yang hampir sama. Dalam regex, tanda bintang diletakkan setelah sebuah karakter, yang artinya karakter tersebut dapat ada nol atau lebih perulangan yang diharapkan dalam pola. Sedangkan untuk tanda tambah, itu berarti harus ada satu atau lebih (tidak boleh nol) karakter yang ditulis dalam aturan. Misalkan, dalam contoh program berikut.
1 2 3 4 5 6 7 8 9 10 11 <?php $string = array('rby', 'ruby', 'ruuuby'); foreach($string as $s) { if(preg_match("/ru*by/", $s)) { echo 'Match ru*by '.$s.'<br />'; } if(preg_match("/ru+by/", $s)) { echo 'Match ru+by '.$s.'<br />'; } } ?> ?
Terlihat jelas bahwa string pertama (rby) tidak akan diterima oleh regex tanda tambah, melainkan hanya tanda bintang. Tanda tambah setelah huruf u berarti bahwa minimal ada satu huruf u.
Tanda Tanya
Tanda tanya ? merupakan karakter meta untuk aturan regex yang berarti karakter tersebut opsional, boleh ada boleh tidak. Salah satu contoh kasus penggunaan karakter ini adalah untuk mendeteksi nomer telepon. Kadang ada yang memasukkan kode area dengan pemisah karakter minux -, kadang ada yang tidak. Sebagai contoh, dalam program berikut.
1 2 3 4 5 6 7 8 <?php $telp = '0857111111'; if(preg_match("/0857?111111/", $telp)) { echo 'Nomer telp benar'; } else { echo 'Nomer telp salah'; } ?> ?
Seandainya pun karakter minus dihapus, pola tersebut masih diterima oleh regex karena tanda minus bersifat opsional.
Kurung Kurawal
Kurung kurawal {} merupakan karakter meta yang melambangkan jumlah karakter atau pola yang harus ada. Biasanya kurung kurawal disertakan setelah kurung siku, yang berarti harus terdapat beberapa karakter yang terdapat dalam kurung siku, sejumlah angka yang tertulis di kurung kurawal. Sebagai contoh, misalkan dalam suatu nomer telepon harus terdapat pola angka nol sebanyak tiga kali, maka penulisan programnya sebagai berikut.
6 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
1 2 3 4 5 6 7 8
<?php $telp = '0341000123'; if(preg_match("/03410{3}123/", $telp)) { echo 'Nomer telp benar'; } else { echo 'Nomer telp salah'; } ?>
Anda juga bisa mengkombinasikannya dengan karakter meta yang lain. Sebagai contoh untuk mendeteksi format nomor telepon rumah Kota Malang yang terdiri atas kode area 0341 dan diikuti oleh 6 angka berikutnya, maka regex-nya adalah sebagai berikut.
1 2 3 4 5 6 7 8 <?php $telp = '0341000123'; if(preg_match("/0341?[09]{6}$/", $telp)) { echo 'Nomer telp Malang'; } else { echo 'Nomer telp salah'; } ?> ?
Untuk membuat aturan minimal sejumlah x perulangan, maka Anda bisa menuliskannya dengan diikuti tanda koma setelah angka yang diharapkan. Contohnya, bila ingin terdapat angka minimal 3 digit, maka dapat ditulis [0-9]{3,}. Sedangkan bila menginginkan rentang jumlah perulangan yang diharapkan, Anda dapat menyertakan tambahan angka lain setelah tanda koma, seperti {3,6} yang berarti jumlah perulangan harus antara 3 sampai 6 kali.
Kurung Biasa
7 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Sama seperti dalam matematika, tanda kurung biasa () digunakan untuk mengelompokkan aturanaturan regex lainnya. Tanda kurung paling dalam akan diolah terlebih dahulu, setelah itu baru tanda kurung yang diluarnya. Penggunaannya bisa bermacam-macam, Anda bisa melihatnya pada contoh-contoh selanjutnya.
Karakter Pipe
Karakter pipe atau garis tegak lurus | menyatakan operasi atau. Bila digabungkan dengan tanda kurung, Anda bisa menentukan dalam string harus terdapat suatu pola tertentu. Misalkan, format hanya menerima nomer telepon regional Jakarta, Surabaya, dan Malang, dengan jumlah digit enam atau tujuh. Maka Anda bisa menuliskannya sebagai berikut.
1 2 3 4 5 6 7 8 9 10 11 <?php $string = array('0341000123', '0311231231', '021999999', '041321321', '03112332'); foreach($string as $s) { if(preg_match("/^(0341|031|021)?[\d]{6,7}$/", $s)) { echo 'Nomer '.$s.' sesuai<br />'; } else { echo 'Nomer '.$s.' tidak sesuai<br />'; } } ?> ?
Hasil regex di atas, nomer ke-1 sampai dengan ke-3 merupakan pola yang sesuai. Nomer ke-4 tidak sesuai karena tidak diawali kode area yang ditentukan. Nomer ke-5 tidak sesuai karena hanya mengandung 5 digit nomer setelah kode area.
8 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
3 4 5 6
Assertion lainnya adalah: \B bukan karakter word boundary \A awal dari subject \Z akhir dari subject, atau karakter new line \z akhir dari subject \G posisi yang sesuai di awal subject Semua assertion harus diawali oleh escape character, untuk menandakan bahwa yang digunakan adalah assertion.
Delimeter
Pada contoh-contoh sebelumnya, delimeter yang digunakan adalah tanda slash /. Delimeter juga dapat diganti untuk kasus tertentu, terutama bila Anda memerlukan karakter slash dalam pola yang dicari. Memang bisa menggunakan escape character, tapi jika cukup banyak tanda slash yang diperlukan seperti pada pola URL, maka akan cukup merepotkan. Beberapa delimeter lain yang bisa digunakan adalah /, @, #, ` (bukan tanda petik), ~, %, &, tanda petik satu dan dua. Sehingga, Anda juga bisa menulisnya seperti berikut.
1 preg_match("#asdf#", $string); ?
Program tersebut akan bernilai benar. karena karakter pc langsung diikuti oleh media. Coba Anda ubah kata tersebut menjadi memiliki spasi, maka akan bernilai salah. Sedangkan untuk mencari pattern setelah kata yang dicari, namun menghasilkan nilai negatif,
9 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
menggunakan regex (?!). Maksudnya, yang dicari adalah kata yang tidak diikuti oleh kata lain dalam regex tersebut. Perhatikan contoh berikut ini.
1 2 3 4 5 6 7 8 <?php $string = 'pcmedia'; if(preg_match("/pc(?!media)/", $string)) { echo 'Pattern ditemukan'; } else { echo 'Pattern tidak ditemukan'; } ?> ?
Maka yang akan keluar adalah pernyataan salah. Hal ini karena tidak ada kata pc yang tidak diikuti oleh media, sedangkan yang ada yaitu pcmedia langsung. Untuk melihat ke belakang, regex yang digunakan adalah (?<=). Tujuannya sama, mencari pola dengan awalan pola lainnya. Contohnya adalah sebagai berikut.
1 2 3 4 5 6 7 8 <?php $string = 'pcmedia'; if(preg_match("/(?<=pc)media/", $string)) { echo 'Pattern ditemukan'; } else { echo 'Pattern tidak ditemukan'; } ?> ?
Sedangkan untuk pencarian ke belakang, namun yang dicari adalah nilai negatifnya, maka menggunakan regex (?<!). Sehingga yang akan dicari adalah pola karakter yang tidak diikuti pola yang dimaksud. Coba perhatikan contoh berikut ini.
1 2 3 4 5 6 7 <?php $string = 'pcmedia'; if(preg_match("/(?<!pc)media/", $string)) { echo 'Pattern ditemukan'; } else { echo 'Pattern tidak ditemukan'; } ?
Kode di atas tidak akan menemukan pattern yang dicari, karena dalam string hanya ada kata media yang berawalan pc. Harusnya yang dicari oleh pattern tersebut adalah media tanpa berawalan pc.
Fungsi Sejenis
Selain preg_match(), ada beberapa fungsi regex yang bisa langsung Anda gunakan untuk berbagai kasus. Diantaranya adalah sebagai berikut ini.
preg_replace()
Fungsi ini sama dengan preg_match(), hanya saja fungsi ini akan langsung mengganti pola yang ditemukan dengan string lain. Fungsi ini menerima minimal 3 parameter, yaitu regex, string pengganti, dan string yang akan dicari. Lebih lengkapnya di sini.
preg_match_all()
Berbeda dengan preg_match() yang langsung akan mengembalikan nilai benar jika menemukan
10 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
satu saja pattern yang sesuai. Fungsi ini akan mengembalikan jumlah pattern yang ditemukan, serta dapat mengembalikan apa saja pattern yang ditemukan melalui parameter ketiga. Karena itu fungsi ini membutuhkan minimal 3 parameter yaitu regex, string yang akan dicari, serta array yang akan menyimpan semua pola yang ditemukan. Lebih lengkapnya di sini.
Penjelasan rincinya dapat Anda baca pada blog penulis di http://blog.haqqi.net. Selamat mencoba. Artikel ini pernah dipublikasikan oleh Penulis di majalah PC Media edisi 04/2011 lalu.
Haqqi
Blogger, penulis, entrepreneur, dan pembelajar kehidupan. Mempunyai blog pribadi yang berisi refleksi diri dan opini termasuk curhatan galau. Saat ini sedang menjabat sebagai CEO Mimi Creative dan CEO Tomatech Mobile.
Ikuti @haqqi Lihat semua artikel oleh Haqqi
11 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Pada seri fabricjs sebelumnya, semua objek ketika pertama kali diciptakan sudah memiliki ukuran. Ukuran ini ditentukan melalui properti yang dilberikan kepada konstruktor masing-masing objek.
Membuat theme ataupun plugin wordpress merupakan sebuah pekerjaan yang mudah, terlebih lagi saat ini banyak dokumentasi lengkap yang telah disediakan maupun tutorial yang dapat
Tidak seru kan setelah menggambar objek di atas canvas, Anda tidak bisa mengubahnya? Jadi, setelah memahami secara sederhana cara membuat objek menggunakan library fabricjs,
WordPress adalah CMS yang paling powerful saat ini menurut saya, tapi masih sedikit developer yang saya kenal yang fokus pada CMS ini. Sudah hampir
Tulis Komentar
Email Anda tidak akan dipublikasikan secara bebas. Yang bertanda bintang wajib diisi.
Kirim Komentar Notify me of follow-up comments by email. Notify me of new posts by email.
Pixel Ads
12 of 13
30/10/2012 22:38
http://bisakomputer.com/tutorial-php-pengenalan-dasar-dasar-regex/
Beriklan?
Jadi Penulis?
Tentang Kami
2012 Bisa Komputer | All right reserved Tempatnya segala tutorial komputer
13 of 13
30/10/2012 22:38