PC Media 04/2011 – Penjelasan Regex Email

Seperti janji saya di artikel PC Media tentang Regex PHP

Tulisan ini saya buat tepat setelah naskah PC Media tentang Regex pada PHP, namun saya buat sebagai scheduled post biar terpublish tepat tanggal 1 Maret 2011, waktu pendistribusian PC Media edisi 4/2011. Di penutup artikel tersebut saya sertakan Regex yang cukup kompleks untuk mendeteksi pola dari sebuah email. Sebenarnya regex ini saya ambil juga dari library Form Validation dari framework CodeIgniter. Regex untuk mendeteksi pola apakah email tersebut valid atau tidak dapat ditulis sebagai berikut.

$email = 'ab.cd@gf.hij';
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';
}

Untuk seluruh dasar tentang bagaimana regex bekerja, Anda bisa membeli dan membaca majalah PC Media tersebut. Gak rugi loh investasi 50rb untuk dapat banyak ilmu di PC Media. Banyak tulisan bagus selain tulisan saya yang membuka wawasan, termasuk bagi saya. Saya kan cuma sekedar orang biasa yang berusaha berbagi apa yang saya tahu. Berbeda dengan mereka yang sudah menulis di PC Media sejak lama dan memang mereka ahli di bidangnya. Hehe..

Lanjut ke penjelasan Regex email tersebut. Pertama-tama, coba perhatikan bagian awalnya.

/^([a-z0-9\+_\-]+)

Seperti penjelasan pada artikel, slash merupakan delimeter pembuka. Tanda caping menyatakan bahwa apa yang tertulis di depannya (yaitu yang di dalam tanda kurung), harus menjadi awal dari sebuah pola. Apa saja karakter yang diperbolehkan di dalamnya? Semua didefinisikan dalam kurung siku. a-z menyatakan alfabet, 0-9 menyatakan angka, kemudian tanda tambah, underscore, dan minus (tentu saja dengan escape character). Di kanan kurung siku ada tanda tambah, ini menyatakan bahwa yang ada di dalam kurung siku itu minimal ditulis sekali. Sebenarnya ini menandakan alamat email sebelum karakter “@” itu harus ada minimal satu karakter.

Pola berikutnya dideteksi dari regex berikut.

(\.[a-z0-9\+_\-]+)*

Seluruh bagian diapit tanda kurung biasa. Perhatikan yang di dalamnya dulu. Ada titik dengan escape character. Ini artinya bagian berikutnya harus diawali oleh titik. Tapi tidak boleh titik saja. Setelah titik harus ada karakter lainnya yang aturannya sama seperti sebelumnya. Karakter yang diperbolehkan diapit tanda kurung siku. Sama, tanda tambah menyatakan bahwa setelah titik tersebut, harus ada minimal 1 karakter yang diperbolehkan. Nah, bagian paling kanan kurung terluar ada tanda bintang, ini menyatakan bahwa pola titik dan huruf tersebut boleh tidak ada ataupun ada berulang berkali-kali.

Setelah itu, di samping kanan tanda bintang terdapat karakter:

@

Karakter tersebut tidak memiliki karakter meta di sebelah kanannya. Itu artinya karakter ini harus ada dan benar-benar hanya satu pada string yang dicari polanya. Jika ada 2 atau tidak ada sama sekali, berarti tidak valid.

Sampai sini, bisa disimpulkan bahwa alamat email dengan kata awal muhammad@, muhammad.fauzil@, muhammad.fauzil.haqqi@, ataupun a.b.c.d.e.f.g@ merupakan format yang benar. Sedangkan muhammad.@ dan .haqqi@ merupakan format yang salah.

Berikutnya adalah regex di samping kanan karakter @:

([a-z0-9\-]+\.)+

Ini sebenarnya digunakan untuk mencari pola alamat domain. Misalkan nama domain adalah blog.haqqi.net, maka yang akan dicari adalah yang sebelum “net” itu. Perhatikan yang di dalam kurung terlebih dahulu. Karakter a-z, 0-9, dan minus diperbolehkan dalam nama domain. Masih ingat tanda tambah di sebelah kanan penutup kurung siku? Ya, itu artinya adalah karakter yang diperbolehkan minimal harus ada satu. Ini dengan asumsi bahwa nama domain/subdomain boleh menggunakan hanya satu karakter. Di sebelah kanannya, ada karakter titik yang diawali escape character. Itu berarti setelah karakter apapun, harus diakhiri oleh tanda titik. Di luar tanda kurung, ada tanda tambah yang menyatakan bahwa kata-kata yang berakhiran titik, minimal harus ada satu atau lebih perulangan.

Di sebelah kanan terdapat pola selanjutnya.

[a-z]{2,6}$/ix

Ini untuk mencari pola top-level domain, seperti dotnet, dotcom, dotasia, dan sebagainya. Yang diperbolehkan hanyalah karakter berupa alfabet, karena top-level domain tidak ada yang mengandung angka. Nah, karakter tersebut harus muncul sejumlah angka yang tertulis di dalam kurung kurawal, yaitu antara 2 sampai 6 (inclusive). Inclusive maksudnya adalah minimal 2 dan maksimal 6. Tanda dollar di sebelah kanannya menyatakan bahwa pola yang dicari ini harus berakhiran karakter yang telah didefinisikan sebelumnya, yaitu 2 sampai 6 karakter top-level domain. Setelah itu, di sebelah kanannya adalah delimeter penutup. Huruf i dan x merupakan modifier yang berarti huruf i menentukan aturan bahwa regex ini case-insensitive, sedangkan huruf x akan menghilangkan whitespace atau komentar jika ada.

Digabungkan dengan aturan sebelumnya, maka domain haqqi.net, blog.haqqi.net, ataupun a.b.c.d.e.id pun diperbolehkan. Yang tidak diperbolehkan adalah yang berakhiran titik, berawalan titik, atau berakhiran kata yang mengandung angka atau lebih dari 6 karakter.

Jika dilihat dari awal, maka inilah salah satu cara pencarian Regex untuk email yang benar. Dengan demikian, tidak perlu membuat fungsi tersendiri yang melakukan perulangan, pengecekan karakter, dan sebagainya yang sebenarnya malah akan memakan banyak resource. Lebih mudah dengan Regex bukan?

Sebenarnya saya juga nulis sekilas tentang Regex untuk tabloid PC Mild edisi 03/2011. Buat yang gak punya dana beli PC Media, gak ada salahnya beli PC Mild aja. Sama-sama ada tulisan saya kok. Hehe…

Share more, Learn more…

17 Comments

  1. Mo nanya Cak Haqqi,……
    Eh sebelumnya salam kenal dulu yak,..ane barusan beli PC Media, n kebetulan suangat tertarik sama regex.

    Kalo mau menghilangkan karakter di PHP kan bisa pake fungsi preg_replace yang mana regex bermain juga disana….

    Kebetulan ane lagi nyoba grabbing halaman web, dan untuk upaya bersih2 kan kode HTML harus dihilangkan tuh. Nah, bagaimana me-regex kan pola HTML dan propertiesnya agar habis semua, dan tertinggal data yg kita inginkan saja.

    Misal : menghapus seluruh tag FONT beserta embel2nya,…..semisal , bla bla bla…..
    jenis font dan warna kan berubah-ubah,….selama ini ane identifikasi satu-persatu setiap font yg ditemukan dan mem-preg_replacenya satu-satu jugha….ribet tho…

    T_T

    Mohon bantuannya yak…

    Reply
  2. kalo membuat regex dicampur string yang bisa diinput user dan pengecekannya bisa dilakukan lewat kata yang ada didatabase itu bagaimana caranya ya??

    Reply
    • maksudnya mau nyari regex seperti apa sih? kalo harus ada string dari input user, kan tinggal main2 di karakternya.. coba deh baca pc media-nya dulu.. πŸ˜€

      Reply
      • jadi misalnya saya input kalimat ‘saya pergi makan dan pulangnya beli oleh-oleh’. Trus penggunaan regex bisa untuk mengecek kalimat itu menggunakan kata2 bahasa Indonesia yang benar atau tidak. Jadi kalau ada salah ketik menampilkan error. Misalnya kata ‘yang’ diketik ‘ynag’. Yang ingin saya tanya apakah regex bisa digunakan untuk fungsi seperti ini?

        Reply
        • wah, kalau itu sih natural language processing. bisa mungkin pakai regex, tapi harus banyak kondisi, karena ada banyak kemiripan yang hanya bisa diketahui manusia. misal: sagu dan dagu sama2 benar di KBBI. tapi kalau kalimat: “saya makan sagu”. bagaimana cara mengetahui itu yang benar sagu atau dagu? kalau diruntut dari kamus, berarti harus mencari sekian banyak kata di kamus.

          regex sebenarnya hanya untuk pencarian pola, semisal alamat email atau nomor telepon. regex juga dipakai untuk program “reg spasi dll” itu loh.

          Reply

Leave a Comment.