Pengenalan ReGex PHP

Repost dari artikel saya di PC Mild 03/2011

Mendeteksi suatu pola dari sebuah string atau kumpulan karakter bisa dengan berbagai macam cara. Misalnya, untuk mencari apakah string “xyz” ada dalah string “abcdefgxyzabc”, cara paling sederhana adalah melakukan perulangan dari awal sampai akhir hingga mengeluarkan hasil apakah ditemukan atau tidak.

Namun cara tersebut cukup merepotkan ketika pola yang dicari cukup rumit. Misalkan saja untuk mendeteksi apakah sebuah string merupakan alamat email yang valid, maka harus dilakukan beberapa perulangan. Perulangan pertama untuk mencari karakter “@”, yang hanya boleh ada satu saja. Kemudian perulangan berikutnya adalah mencari apakah ada titik paling kanan setelah karakter “@” tersebut yang diapit oleh karakter di depan dan di belakangnya.

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. Dalam PHP, yang sering digunakan adalah PCRE atau “Perl Compatible Regular Expression”. Berikut ini adalah beberapa dasar teori Regex PHP yang bisa Anda gunakan.

  1. Fungsi yang digunakan untuk Regex dalam php adalah preg_match($regex, $string), di mana $regex adalah pola yang akan dicari dan $string adalah variabel yang akan dicari apakah ada pola $regex di dalamnya. Contoh Regex paling sederhana untuk mencari apakah ada pola “fgh” dalam string “abcdefghijk” sebagai berikut.
    <?php
    $string = 'abcdefghijk';
    if(preg_match("/fgh/", $string)) {
      echo 'String berisi pola fgh';
    } else {
      echo 'Tidak ada pola fgh dalam string';
    }
    ?>
  2. Untuk mencari pola “berawalan suatu string”, maka regex yang digunakan adalah karakter caping “^”. Contohnya, apakah string berawalan “abc” maka regex-nya adalah sebagai berikut.
    <?php
    $string = 'abcdefghijk';
    if(preg_match("/^abc/", $string)) {
      echo 'String berawalan abc';
    } else {
      echo 'Tidak berawalan abc';
    }
    ?>
  3. Regex di atas akan mendeteksi secara case sensitive, sehingga tidak dapat mendeteksi huruf kapital seperti “ABC”. Untuk membuatnya menjadi case insensitive, bisa menggunakan regex “i” seperti berikut ini.
    <?php
    $string = 'abcdefghijk';
    if(preg_match("/^ABC/i", $string)) {
      echo 'String berawalan abc';
    } else {
      echo 'Tidak berawalan abc';
    }
    ?>
  4. 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.
    <?php
    $string = 'abc123xyz';
    if(preg_match("/xyz\z/i", $string)) {
      echo 'Pola berakhiran xyz ditemukan';
    } else {
      echo 'Pola tidak ditemukan';
    }
    ?>
  5. 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, 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 3+5 dalam sebuah string, maka bisa ditulis sebagai berikut.
    <?php
    $string = '1+1=2';
    if(preg_match("/^1\+1/i", $string)) {
      echo 'Pola 1+1 ditemukan';
    }
    else {
      echo 'Tidak ditemukan';
    }
    ?>
  6. Karakter meta tersebut berbeda-beda fungsinya. Karakter kurung siku “[]” adalah untuk mendeskripsikan apakah karakter yang ada dalam tanda kurung tersebut terdapat pada string. Sebagai contoh, untuk mencari apakah karakter a, b, c, d, e, dan f ada dalam string, maka regex-nya dapat ditulis dengan “[abcdef]”. Penulisan karakter atau angka yang berurutan juga dapat ditulis dengan penghubung dash “-“, sehingga menjadi “[a-f]”.
    <?php
    $string = 'abcefghijklmnopqrstuvwxyz0123456789';
    
    preg_match_all("/[a-f]/", $string, $matches);
    
    foreach($matches[0] as $value) {
      echo $value . '<br />';
    }
    ?>
  7. Dalam kasus ini, semua meta karakter selain tanda caping “^” jika diletakkan dalam tanda kurung hanya akan dianggap karakter biasa. Namun untuk tanda caping bila diletakkan di bagian depan, maka berarti yang dicari adalah pola selain karakter yang ada di dalamnya. Sebagai contoh, jika ingin mencari pola selain huruf “bgjk” dalam string, maka harus ditulis sebagai berikut.
    <?php
    $string = 'abcefghijklmnopqrs';
    
    preg_match_all("/[^bgjk]/", $string, $matches);
    
    foreach($matches[0] as $value) {
      echo $value . '<br />';
    }
    ?>
  8. Kumpulan karakter khusus juga bisa disederhanakan dengan escape character tertentu, antara lain “\d” untuk semua karakter numerik, sehingga berfungsi sama seperti “[0-9]”, “\D” untuk karakter non-numerik, “\s” untuk whitespace character, “\S” untuk non-whitespace character, “\w” untuk alpha-numeric character, “\W” untuk non-alphanumeric character.
    <?php
    $string = 'abcefghijklmnopqrs';
    
    preg_match_all("/\D/", $string, $matches);
    
    foreach($matches[0] as $value) {
      echo $value . '<br />';
    }
    ?>
  9. Dengan menggabungkan semua teori Regex, Anda bisa membuatnya untuk mencari pola yang kompleks seperti alamat email. Anda bisa membaca lebih lanjut tentang Regex di dokumentasi php http://php.net/manual/en/function.preg-match.php.
    <?php
    $email = 'me@haqqi.net';
    if(preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $email)) {
      echo 'Email valid';
    } else {
      echo 'Email tidak valid';
    }
    ?>

Penjelasan regex di atas dapat Anda baca di post saya sebelumnya tentang Regex Email. Selamat mencoba..!!

Download source code secara keseluruhanArtikel ini telah dipublikasikan di media cetak tabloid PC Mild edisi 03 tahun 2011 lalu.

19 Comments

Leave a Comment.