Pengenalan Dasar Regex pada PHP

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, 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 fungsi-fungsi 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, 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.

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 “\\\\”.

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("/[a-f]/", $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.

Bintang dan Tambah

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 />';
  }
}
?>
Program tersebut akan menghasilkan output:
1
2
3
4
5
Match ru*by rby
Match ru*by ruby
Match ru+by ruby
Match ru*by ruuuby
Match ru+by ruuuby
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 = '0857-111111';
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.
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 = '0341-000123';
if(preg_match("/0341-?[0-9]{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.

Urutan Karakter Khusus

Alfabet dan angka merupakan karakter khusus yang berurutan. Cukup merepotkan bukan bila harus menulis [abcd sampai xyz] ataupun [a-z]? Sama seperti format lainnya, dalam regex juga dikenal escape character khusus untuk alfabet, angka, dan linebreak. Berikut ini adalah daftar urutan karakter khusus yang berlaku pada regex.
  • \d – Untuk seluruh karakter berupa angka, sama seperti [0-9]
  • \D – Untuk seluruh karakter yang bukan angka, sama seperti [^0-9]
  • \s – Untuk karakter whitespace, sama seperti penulisan [\t\r\n\f\v]
  • \S – Untuk karakter non whitespace, sama seperti penulisan [^\t\r\n\f\v]
  • \w – Untuk semua karakter alpha-numeric, yaitu alfabet dan angka, sama seperti [a-zA-Z0-9_]
  • \W – Untuk semua karakter non alpha-numeric, sama seperti [^a-zA-Z0-9_]
Contoh penggunaannya sebagai berikut. Misalkan Anda sedang mencari string dengan pola yang diawali sebuah angka, kemudian 3 huruf, dan diakhiri oleh sebuah angka maupun huruf. Maka, penulisannya adalah:
1
2
3
4
5
6
<?php
$string = '2hgd3';
if(preg_match("/^\d[A-Za-z]{3}\w$/", $string)) {
  echo 'Pola sesuai';
}
?>

Kurung Biasa

Sama seperti dalam matematika, tanda kurung biasa “()” digunakan untuk mengelompokkan aturan-aturan 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('0341-000123', '0311231231',
  '021999999', '041321321', '031-12332');
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.

Modifiers dan Assertions

Pada contoh sebelumnya, Anda telah mempelajari modifier “i” untuk menyatakan bahwa regex yang digunakan adalah case insensitive. Berikut ini adalah beberapa modifier lain yang bisa Anda gunakan sesuai kasus yang Anda butuhkan.
  • i – tidak menghiraukan huruf kapital atau case insensitive
  • U – pencarian regex dengan metode ungreedy
  • s – menyertakan new line dalam pola
  • m – memperbolehkan pola dalam baris yang berbeda
  • x – untuk regex dengan komentar dan whitespace
  • e – evaluasi kode php (khusus fungsi preg_replace)
  • S – analisis tambahan terhadap pola
Modifier harus ditulis setelah delimeter penutup di sebelah kanan regex.
Untuk assertion juga ada beberapa regex yang bisa digunakan.
Karakter “\b” berarti sebagai word boundary, atau batasan sebuah kata. Ini untuk mencegah pola yang dicari ada sebagai substring dari kata lainnya. Sebagai contoh, untuk mencari kata “aman” dalam kalimat “halaman ini telah aman”, maka harus ditulis sebagai berikut.
1
2
3
4
5
6
<?php
$string = 'halaman ini telah aman';
if(preg_match("/\baman\b/", $string)) {
  echo 'Pola ditemukan';
}
?>
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);

Melihat Pola di Depan dan Belakang

Regex memiliki kemampuan untuk mencari pola dengan melihat ke belakang maupun ke depan dari pola yang dicari. Misalkan, ingin hanya mencari kata “nama” yang didepannya diikuti oleh tanda titik dua. Atau ingin mencari kata “media” yang diawali dengan kata “pc”. Semua bisa dilakukan dengan Regex.
Untuk melihat karakter atau kata di depan kata yang dicari, Anda bisa menggunakan regex “(?=)”. 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';
}
?>
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, 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 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.

Pola Email

Setelah mempelajari semua dasar regex dalam PHP, Anda bisa merangkainya menjadi salah satu cara pencarian pola kompleks seperti alamat email. Ada banyak regex yang bisa diimplementasikan, tergantung cara pikir masing-masing programmer. Berikut ini adalah salah satu regex yang digunakan untuk mendeteksi apakah alamat sebuah alamat email valid atau tidak.
1
2
3
4
5
6
7
8
<?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';
}
?>
Artikel ini pernah dipublikasikan oleh Penulis di majalah PC Media edisi 04/2011 lalu.
Sumber lain bisa Anda baca di sini dan di sini.


Previous
Next Post »

1 comments:

August 23, 2017 at 2:13 AM ×

Saya sangat berterimakasih banyak kepada aki wono atas bantuan dana ghaibnya dan saya tidak pernah menyanka kalau saya bisa mendapatkan uang sebesar 470 juta,berkat bantuan aki saya bisa melanjutkan bisnisku lagi dan saya tidak pernah menyanka kalau ini benar benar nyata karna sudah banyak paranormal yang sudah saya hubungi dan saya datangi,itu tidak pernah membawakan hasil bahkan uang saya habis dibawa lari sama mereka dan cuma aki wono saja yang membawakan hasil kalau anda mau di bantu silahkan hbg aki wono di nmr 085-320-535-559...aki wono juga bisa mengeluarkan angka togel yg di jamin 100% tembus seperti 4d 5d 6d angka dari aki betul-betul tembus karna sya udah buktikan terimakasi

Congratulation, Unknown have the first comment
Balas
avatar
admin

Berkomentarlah dengan baik dan benar Show Konversi KodeHide Konversi Kode Show EmoticonHide Emoticon

Thanks for your comment