Rabu, 16 Februari 2011

cURL di PHP melalui proxy ISA server

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_PROXY,'alamat.proxyisa.nya');
curl_setopt($ch, CURLOPT_PROXYPORT,'8080');

curl_setopt( $ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM ); 

curl_setopt ($ch, CURLOPT_PROXYUSERPWD, 'username:password'); 

$content = curl_exec($ch);
curl_close($ch);

Selasa, 15 Februari 2011

Kuasai Regex

Steven Haryanto

Bagian: 1—Pengenalan dan Karakter Meta Sederhana

Tingkat: Dasar

Tujuan: Setelah membaca bagian pertama ini, pembaca diharapkan
memahami beberapa metakarakter regex sederhana: dot, set karakter, lternasi, jangkar, shortcut quantifier +, *, ?, serta pengelompokan.

Abstrak: Apa itu regular expression (regex), mengapa regex perlu, beberapa contoh awal.

Prasyarat: Kenal dgn salah satu bahasa pemrograman Perl, PHP, atau Python. Ini tdk wajib, tapi akan membantu dlm memahami contoh-contoh.

Kuis berhadiah BMW portal Astaganaga.com hari ini ditutup dan akan diundi dua minggu lagi. Ternyata jumlah formulir yg disubmit mencapai lebih dari 40 ribu!
Sukses
besar. Kebetulan, karena Anda seorang programer PHP yg telah mengerti tentang SQL dan RDBMS (meskipun hanya MySQL), data tiap
formulir online sudah masuk semua dgn rapi ke database. dgn bangga Anda membuka browser dan mengakses URL phpMyAdmin dan
bermaksud melihat-lihat data yg telah terkumpul.

Nama propinsi kebetulan seragam semua, karena Anda telah membuat field isian berupa kotak select, sehingga pengisi formulir tinggal memilih dari daftar propinsi yg disediakan. Tapi, wah, ternyata nama kota cukup bervariasi karena di formulir berupa kotak isian. Banyak sekali terjadi salah ketik: “Jakrta”, “Seamrng.” Ada yg menulis dgn singkatan “DKI” atau “Bdg.” Ada pula yg berbaik hati menuliskan lengkapnya, “Jakarta Barat” atau malah “Kotamadya Bogor.” Dan ternyata Anda lupa melakukan pengecekan kode pos, sehingga ada sebagian yg salah, atau mungkin iseng, mengisi dgn huruf “tidak ada” atau “-” atau deretan huruf tertentu. Belum lagi alamat
jalan, bervariasi sekali.

Repotnya, sang bos ternyata meminta data ini dirapikan sebaik-baiknya, karena akan disusun menjadi database alamat yg mungkin bisa berguna di kemudian hari. Untuk mengirim penawaran via pos—alias junk mail—misalnya, atau malah daftar ini untuk dijual ke perusahaan lain. Dan karena Anda yg menyusun databasenya, Anda pulalah yg ketiban tugas merapikannya.

Bos jg minta penulisan alamat sestandar mungkin. Semua dijadikan huruf besar. prefiks “Jalan” harus disingkat menjadi “Jl.” Gang menjadi Gg. Dan sudah pasti nama-nama kota harus dibetulkan. Salah Anda sendiri sebetulnya, kenapa tdk menyediakan daftar kota dari database. Tapi kesalahan selalu bisa terjadi toh.

Solusi Non-Regex

Oke, tugas pertama mengkonversi ke huruf kapital cukup
mudah. Anda programer PHP, jadi Anda tinggal menggunakan fungsi builtin strupper().


PHP Code:
# Langkah 1
$alamat=strupper($alamat); 
Sampai
di sini alamat telah berubah menjadi string berhuruf besar semua. Hei, sebentar dulu. Ternyata ada alamat yg diawali spasi. Berarti, Anda perlu menghilangkan
dulu semua spasi di awal. Untungnya di PHP tersedia fungsi ltrim().

PHP Code:
# Langkah 0
$alamat=ltrim($alamat); 
Wah,
ternyata Anda menyadari banyak jg yg mengetik spasi ganda bahkan tiga empat kali. Kok bisa ya? Bagaimana cara membetulkannya?

PHP Code:
# Langkah 0.2
while (1) {

    
$alamat2=str_replace("  "" "$alamat);

    if (
$alamat2 == $alamat)

         break;

    else

         
$alamat=$alamat2;

Kode
di atas mengubah string ganda (dua buah spasi) menjadi satu spasi terus-menerus
hingga sudah tdk ada lagi string ganda.

Tugas
berikutnya menyingkat Jalan dan Gang. Sekali lagi, karena Anda programer PHP,
Anda tinggal menggunakan fungsi string yg telah disediakan, str_replace().

PHP Code:
# Langkah 2.1
$alamat=str_replace("JALAN""JL."$alamat); 
Mudah
ya? Satu lagi:

PHP Code:
# Langkah 2.2
$alamat=str_replace("GANG""GG."$alamat); 
Hm, tapi ternyata ada jalan di Jakarta bernama
Ganggeng. Seorang Ibu Anwar misalnya, tinggal di
“Jalan Ganggeng 15.” Tentu saja tdk boleh diubah
menjadi Gg.geng bukan? Bagaimana solusinya? Kita hanya boleh mengubah “Gang” yg berada di awal string.
Untuk mengetahui posisi string dlm string lain, gunakan fungsi strpos(). Jika fungsi ini
mengembalikan nilai 0, maka string yg dicari ada di awal.

PHP Code:
# Langkah 2.2b
if (strpos($alamat"GANG") === 0) {

    
$alamat=GG." . substr($alamat, 4);

Ternyata
belum benar. Ada seorang Bapak yg beralamat di “Jalan Kehakiman, Gang Haji Umar
no. 14.” Uji yg tepat sebetulnya adalah mencari kata
“Gang” yg berdiri sendiri, bukan bagian dari sebuah kata. Bagaimana caranya?

PHP Code:
# Langkah 2.2c
$ALFABET="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$ganti=false;

if ((
$pos=strpos($alamat"GANG")) !== false) {

    
# kata "GANG" berdiri sendiri jika terdapat di awal atau di akhir

    # string, atau dibatasi spasi atau tanda baca.

    
if ((($pos == 0) or

         (
strpos($ALFABETsubstr($alamat$pos-11)) === false))

        and

        ((
$pos == strlen($alamat)) or

         (
strpos($ALFABETsubstr($alamat$pos+41)) === false))

       ) 
$ganti=true;

}

if (
$ganti)

    
$alamat=substr($alamat0$pos) . "GG." .

              
substr($alamat$pos+4); 
Kode
di atas pertama-tama mencari potongan “GANG”. Jika ditemukan, maka dilakukan
pengujian sekali lagi apakah satu karakter di kiri dan di kanan “GANG” bukan
sebuah huruf. Jika benar, maka barulah dilakukan penggantian.

Ternyata
derita Anda belum berakhir sampai di sini. Entah mengapa, banyak sekali yg
mengeja “Gang” dgn “Gank” dan “Geng”. Terpaksa menambahkan potongan-potongan kode lagi ke kondisi pengujian sebelumnya. Belum lagi Anda masih harus membetulkan nama kota dan kode pos. Semakin banyak saja Anda harus memotong-motong dan menggabungkan
string, mencari string di string lain, melakukan loop, pengujian, dsb. Duh,
merepotkan! Lama-lama Anda jadi mempertimbangkan untuk
mengedit langsung saja semua data tersebut secara manual.

Contoh kasus di atas hanyalah secuil dari tugas mengolah teks.
Tugas lainnya kadang jauh lebih kompleks. Mengerikan. Apakah mengolah teks
harus bertele-tele dan merepotkan seperti contoh di atas?

Kenalkan,
Regex


Jawabnya,
untung saja, tdk. Ada sebuah bahasa mini yg disebut regular expression (regex) yg akan Anda pelajari sesaat lagi. Regex adalah sebuah fasilitas yg
ampuh, yg memungkinkan Anda mengolah teks secara jauh lebih ringkas, tdk
bertele-tele. Tanpa regex, rasanya pengolahan teks tingkat lanjut itu tdk terbayangkan repotnya. Bahkan, jika Anda buta regex, maka kemampuan mengolah teks Anda akan terus berada di tingkat taman kanak-kanak. dgn menguasai regex, Anda akan memandang teks dlm kacamata yg baru. Anda akan lebih lihai dan lancar dlm memainkan huruf dan angka,
potongan dan kata, baris dan paragraf teks. Anda tdk akan
takut lagi menghadapi data yg menyimpang atau aneh-aneh. Anda akan terlatih menemukan pola dari ketidakteraturan. Pendek
kata, sekali mengenal regex—bolehlah penulis sedikit berlebihan di sini—hidup
Anda tdk akan sama lagi!

Pengetahuan regex jg amat berguna, karena dipakai di mana-mana.
Bukan hanya di Perl, yg amat intensif menggunakan regex, tapi jg di bahasa
pemrograman lain mulai dari Python hingga Java, dari Javascript hingga VB.
Bukan hanya di Unix dgn utilitas-utilitas grep dan awk-nya, tapi jg di
Windows dan OS lain dlm berbagai program. Misalnya akan Anda jumpai di editor
teks (seperti vi dan joe), di file konfigurasi berbagai daemon dan utilitas
(seperti procmail, exim, dan Apache), bahkan di aplikasi seperti Microsoft Word
dan Borland Delphi regex pun tak luput dikenali. Intinya, pengetahuan regex
Anda akan sangat portabel dan terpakai.

Wildcard

Anda
yg pernah memakai DOS atau Linux tentunya familiar dgn wildcard—atau
globbing jika di Unix. Wildcard adalah sebuah string pola yg dpt digunakan
untuk dicocokkan dgn sekumpulan nama file dan direktori. Misalnya: *.exe akan cocok dgn semua file
berekstensi .exe. Karakter
khusus wildcard ‘*’ di sini
berarti cocok dgn deretan satu atau lebih karakter apa saja. Contoh lain, ???.txt akan cocok dgn tiap file .txt yg namanya terdiri dari tiga huruf.

Latihan
1


Jawaban
ada di akhir tulisan.

  1. Apa
    wildcard dari “semua nama file berekstensi apa saja”?
  2. Apa
    wildcard dari “Semua file ZIP yg berawalan A, B, dan C”?
  3. Apakah
    akan F*.* cocok dgn nama
    file FileSaya di DOS/Linux? Bagaimana dgn f*?

Wildcard bisa dibilang bentuk primitif mirip regex. Namun regex jauh lebih ampuh dan
ekspresif daripada wildcard, dpt menyatakan pola-pola yg lebih kompleks.

Pemilihan,
Pengelompokan, Set, dan Opsional

Sama
seperti wildcard, regex pun adalah sebuah string pola. Pola yg akan
dicocokkan oleh komputer dari kiri ke kanan. Pola regex “satu” misalnya, cocok
dgn string “satu” dan tdk dgn string “dua”. tdk ada bedanya dgn
operasi pembandingan string biasa bukan?

Beberapa
karakter dlm sebuah pola regex akan diartikan secara khusus.
Karakter-karakter ini disebut karakter meta (alias, bukan yg
sesungguhnya). Ini sama seperti karakter *

dan ? di wildcard yg bukan
diartikan sebagai karakter literal bintang dan tanda tanya itu sendiri,
melainkan berarti khusus. Demikian jg karakter-karakter meta.

Jika
wildcard di DOS hanya mengenal dua karakter meta, ? dan *, dan
itu pun tdk fleksibel, maka dlm bahasa regex standar umumnya dikenal
beberapa jenis karakter meta lain. Berikut ini beberapa karakter meta dasar.
  • | (garis vertikal) untuk pemilihan;
  • ( dan ) (kurung buka dan kurung tutup) untuk pengelompokan;
  • [ dan ] (kurung siku buka dan tutup) untuk membuat set
    karakter;
  • ? (tanda tanya) untuk mengartikan
    opsional.

Kasus
2: Berbagai Cara Mengeja Nama

Punya
nama yg, ehem, keren belum tentu sepenuhnya berkah. Banyak jg yg salah
mengeja nama saya. “Steven” kadang-kadang ditulis orang “stephen”, kadang jg
“stefen”—meski lebih jarang. Bagaimana mencari semua kemungkinan orang menulis
nama itu?

PHP Code:
if (strpos($nama"steven") !== false or

    
strpos($nama"stephen") !== false or

    
strpos($nama"stefen") !== false) {

    
# lakukan sesuatu di sini
Tapi,
ada jg ternyata yg menulis “stefan”. Jika kita kombinasikan semua
kemungkinan, maka kini ada 3×2 variasi. Lalu pernah jg ada dokter yg
menulis nama saya “stefanus” atau “stevanus” di kartu pasiennya. Nama belakang
“haryanto” saya pun pernah ditulis “harijanto”, “hariyanto”, atau “herjanto”.
Berarti ada puluhan kombinasi sekarang. Apakah kita harus terus-menerus
memperpanjang perbandingan dgn sekian belas fungsi strpos() dan operator or? Tentu tdk, kan sudah ada regex.

PHP Code:
ste(v|f|ph)[ea]n(us)? h[ae]ri?[jy]anto 
Wuih,
tunggu dulu. Regex seperti itu? Mengerikan jg. Tenanglah. Regex itu harus
dipandang sebagai teman. Notasinya memang ringkas sekali, tapi keringkasan
justru menjadi salah satu keunggulan regex. Jika mata Anda sudah terbiasa,
semoga akan bisa lebih cepat dan mudah memahami sebuah pola regex. Pola di atas
tadi terdiri dari beberapa karakter meta. Kita bahas satu-persatu.

Pemilihan

|
disebut jg alternasi atau pemilihan. dpt dibaca sebagai “atau”. Gunanya
untuk memilih satu dari dua atau lebih alternatif yg kita sediakan. Beberapa
contoh:
  • aku|kamu, cocok dgn aku
    atau kamu, tapi tdk dgn dia;
  • apel|anggur|pisang, cocok dgn
    salah satu dari apel, anggur, atau pisang, tapi tdk
    dgn jambu karena itu tdk ada dlm daftar pilihan.

Pengelompokan


( dan )
berguna untuk mengelompokkan, persis seperti tanda kurung dlm operasi
matematika. Umumnya dipakai bersama karakter meta lain. Contoh:
  • satria (baja hitam|pembela kebenaran)
    akan cocok dgn “satria baja hitam” atau “satria pembela
    kebenaran
    ”. Regex ini berbunyi sebagai berikut: “deretan huruf
    ‘satria’ diikuti spasi dan diikuti ‘baja hitam’ atau ‘pembela
    kebenaran’.

Set karakter

[ dan ]
mengapit sebuah set karakter. Pada dasarnya berguna untuk memberi pilihan jg,
sama seperti |, namun memiliki
perbedaan pilihannya berupa huruf dan memiliki sintaks rentang dan negasi.
Sintaks rentang adalah [m-n] dan
akan cocok dgn karakter mulai dari m hingga n. Sintaks negasi
adalah [^m] dan akan cocok
dgn semua karakter kecuali m. Berikut beberapa contoh set.
  • bat[aoiu]k, cocok dgn batak,
    batok, batik, atau batuk.
  • bat(a|i|o|u)k, sama dgn
    sebelumnya, namun menggunakan |.
  • [0-9], cocok dgn angka 0 hingga 9.
  • [A-EG-Z], cocok dgn semua huruf
    besar kecuali F.
  • [0-9][0-9], cocok dgn `00’ hingga
    ‘99’ (100 kombinasi).
  • [012][0-9], cocok dgn ‘00’ hingga
    ‘29’ (30 kombinasi)
  • [012][0-9]|30, cocok dgn ‘00’
    hingga ‘29’ atau ‘30’ (30 plus 1 kombinasi)
  • sem([ui]|bilan), cocok dgn semi,
    semu, atau sembilan. tdk cocok dgn semibilan, semubilan,
    maupun semuibilan.

Opsional

Arti
? di regex berbeda dgn di
wildcard. Di regex, ? berarti
huruf atau kelompok di kiri bersifat opsional. dpt jg dibaca sebagai “boleh
ada atau boleh tdk.” Beberapa contoh:
  • silah?kan, cocok dgn silakan

    atau silahkan.
  • (silah)?kan, cocok dgn silahkan
    atau dgn kan saja.
  • advi([sc]es?|sory), cocok dgn advice,
    advise, advices, advises, atau advisory. Regex
    ini berbunyi “empat huruf advi diikuti dgn salah satu dari: a)
    huruf s atau c yg diikuti e dan boleh diikuti s; atau b) deretan
    huruf sory.”
Jadi kembali ke kasus variasi ejaan nama, regex kita berbunyi demikian: “Tiga huruf ste diikuti salah satu dari v, f, atau ph; diikuti salah satu dari e atau a;
diikuti huruf n; boleh diikuti ‘us’, tapi boleh jg tdk. Diikuti
spasi dan deret tiga huruf har; boleh diikuti huruf i, dpt jg
langsung diikuti salah satu dari huruf j atau y. Terakhir, diikuti oleh deret
4 huruf anto.” krn ringkas, seluruh kalimat keinginan kita tadi
dpt dinyatakan hanya dgn satu pola regex! dgn regex, kita dpt
mempersingkat mgkn puluhan baris if-or menjadi hanya satu baris kode PHP:


PHP Code:
if (preg_match("/ste(v|f|ph)[ea]n(us)? h[ae]ri?[jy]anto/"$nama)) { # lakukan sesuatu di sini
Pada
dasarnya regex bisa menyingkat 100 atau lbh baris kode menjadi hny satu
pola. Singkat berarti lebih cepat ditulis, lbh mudah dikopi-paste, lebih
sedikit kemungkinan salah. Regex jg lbh gampang dibuat ketimbang kode yg
sepadan.

Perhatikan
bahwa pola regex kita dlm kode PHP di atas diapit oleh dua garis miring.
Kegunaan pengapit ini dan lebih jauh mengenai fungsi preg_match() akan dibahas nanti. dlm
Perl, sintaksnya seperti ini:

PHP Code:
if ($nama =~ /ste(v|f|ph)[ea]n(us)? h[ae]ri?[jy]anto/) {

    
# lakukan sesuatu di sini
krn regex begitu terintegrasi dgn Perl, maka Perl memiliki bbrp operator
khusus untuk regex. Pengapit //
disebut operator m//. Terdapat
pula satu operator pengutip literal regex lain yaitu qr//. Pola regex dlm Perl tdk perlu
diapit lagi dgn kutip string, cukup dgn salah satu pengutip regex tadi (m// atau qr//).
Untuk melakukan perbandingan regex, digunakan operator =~.

Sementara
di PHP pekerjaan yg berkaitan dgn regex dilakukan melalui fungsi-fungsi preg_*().

Latihan
2

  1. Seperti
    apa regex yg berbunyi “satu hingga tiga deret karakter a baik huruf
    besar maupun kecil”?
  2. Bagaimana
    mencocokkan karakter yg bukan huruf kecil?
  3. Bagaimana
    mencocokkan string angka ‘15’ hingga ‘51’ dgn regex?
  4. Bagaimana
    mencocokkan dgn tepat string-string anting, ranting, dan ranjang
    dgn seringkas-ringkasnya?
  5. Apakah
    [AS][US][AS] cocok dgn USA?
  6. Apakah
    (Mega|Rahma)wati cocok
    dgn Ibu Megawati? dgn Mega?
  7. Apakah
    Saya( bukan)? pembohong.
    cocok dgn saya pembohong.?

Titik,
Nol-Atau-Lebih, Satu-Atau-Lebih, Jangkar


Berikut ini empat lagi karakter meta dasar lain.
  • . (titik) cocok dgn satu karakter
    apa pun;
  • (bintang)
    untuk mengartikan “nol atau lebih”;
  • + (plus) untuk mengartikan “satu atau
    lebih”;
  • ^ (tanda pangkat) dan $ (dolar) untuk penjangkaran.

Titik

Titik
atau dot adlh lambang yg cocok dgn smua karakter tunggal. Bbrp
contoh:
  • bat.k cocok dgn batak, batok,
    dan jg batbk, bat+k, bat8k, dsb. Namun tdk cocok
    dgn batrak (krn tr adlh dua karakter) atau batk

    (nol karakter).
  • bat.?k sama seperti sebelumnya, namun
    cocok pula dgn batk (nol karakter) krn titik diikuti oleh
    tanda opsional.
  • b...k cocok dgn lebih banyak lagi
    string, mulai dari batak, buruk, bilik, dan semua
    potongan string yg terdiri dari 5 karakter, diawali dgn b dan
    diakhiri dgn k.

Nol-Atau-Lebih,
Satu-Atau-Lebih


Kalau
tanda optional ? bisa dibilang
sebagai “nol-atau-satu”, maka *
melambangkan “nol-atau-lebih” dan +
melambangkan “satu-atau-lebih” dari karakter/kelompok yg berada tepat di kiri tanda tersebut. Bbrp contoh:
  • [0-9]+, cocok dgn deretan angka.
  • .+, cocok dgn satu atau lebih
    karakter apa pun, atau cocok dgn string yg “tidak kosong”.
  • .*, cocok dgn nol atau lebih
    karakter apa pun, atau cocok dgn string apa aja, termasuk jg yg
    kosong.
  • h?(ah|eh)+!*, berbunyi “boleh diawali
    huruf h, terdiri dari deretan ah atau eh, dan boleh

    diakhiri dgn deretan tanda seru.” Cocok dgn string seperti eh,
    hahahah!, atau ehehahehah!!!. tdk cocok dgn string
    seperti haha, hhah!, maupun h!.

Jangkar

^ dan $
masing-masing dpt disebut sebagai “harus di awal” dan “harus di akhir.”
Mengapa disebut jangkar? Kedua karakter ini tdk melambangkan karakter mereka sendiri, ingat, keduanya adlh karakter meta. Bahkan ^ dan $
di sini tdk melambangkan karakter apapun, melainkan mensyaratkan posisi

atau penambatan pola ke string yg ingin dicocokkan. Itulah sebabnya
pasangan karakter meta ini disebut anchor, atau jangkar. Bbrp contoh:
  • 456 cocok dgn 456, 456789,
    maupun 123456 krn ketiganya mengandung pola tersebut.
  • ^456 cocok dgn 456, 456789,
    namun tdk cocok dgn 123456.
  • ^456$ hanya cocok dgn 456,
    tdk dgn 456789 maupun 123456.

Pola
seperti [0-9][0-9] dan pola-pola
lain di contoh sebelumnya bersifat tdk terjangkar krn tdk diberi ^ maupun $.
Jadi di mana pun pola tersebut ditemukan di dlm string—di awal, tengah,
maupun ujung akhir—tetap akan cocok. Sementara jika sebuah pola terjangkar,
maka hanya cocok di awal atau di akhir atau awal-dan-akhir, bergantung pada
jenis jangkar yg diberikan pada pola.

Latihan 3
  1. Bagaimana pola sebuah bilangan bulat positif? Bulat negatif? Desimal
    positif/negatif?
  2. Bagaimana regex yg berbunyi “mengandung string aku”?
  3. Bagaimana
    regex yg berbunyi “tepat string aku”?
  4. Bagaimana
    regex yg berbunyi “diakhiri string aku”?
  5. Bagaimana
    regex untuk mencocokkan nama variabel dlm PHP atau variabel skalar Perl?
  6. Apakah
    ^(Mega|Rahma)wati cocok
    dgn Ibu Megawati?
  7. Apakah
    [^k]apuk cocok dgn bunga
    kapuk yg mulai lapuk
    ?

Sampai di sini dulu. Sampai jumpa di bagian berikutnya.
Jawaban Latihan

Latihan1
  1. *.*
  2. Wildcard
    di Linux lebih ampuh daripada di DOS. Selain karakter khusus * dan ?, shell Linux mengenali set karakter []. Untuk menyatakan kumpulan file
    ZIP berawalan A, B, dan C, Anda dpt menggunakan pola [ABC]*.ZIP di Linux. Sementara di DOS
    Anda perlu membuat tiga wildcard terpisah: A*.ZIP, B*.ZIP,
    C*.ZIP.
  3. Pertanyaan
    ini sedikit menjebak. Kelakuan wildcard di Linux dan di DOS agak berbeda.
    Wildcard pertama, F*.* akan
    cocok dgn file FileSaya
    di DOS. Namun di Linux, wildcard ini berarti “File yg diawali huruf F
    dan mengandung titik di tengahnya.” Jadi jika nama file FileSaya.doc misalnya, maka wildcard
    akan cocok di Linux. Tapi jika tanpa ekstensi—yang berarti tanpa karakter
    titik—maka tdk akan cocok. Wildcard kedua pun hanya cocok di DOS. Ingat,
    Unix membedakan huruf besar dan kecil. krn wildcard diawali huruf f
    kecil, maka tdk akan cocok di Linux.

Latihan
2
  1. [Aa][Aa]?[Aa]?
  2. [^a-z]. Catatan, ini berarti angka,
    simbol, maupun huruf besar cocok dgn pola ini. krn semuanya bukan
    huruf kecil.
  3. 1[1-5]|[234][0-9]|5[01]
  4. r?anting|ranjang. Pola r?an(ting|jang), meskipun lebih ringkas,
    tdk dpt digunakan krn cocok jg dgn anjang, padahal itu
    tdk kita inginkan. Sementara pola ranting|anting|ranjang

    jg dpt digunakan, tapi tentunya itu bukan yg pola yg terpendek.
  5. Ya.
  6. (Mega|Rahma)wati cocok dgn Ibu
    Megawati
    , tapi tdk dgn Mega, krn string yg kedua
    tdk mengandung wati.
  7. Pertanyaan
    ini sebuah jebakan. Regex secara default membedakan huruf besar dan kecil.
    krn itu Saya( bukan)? pembohong. tdk cocok dgn saya
    pembohong.
    .

Latihan
3


Bilangan bulat positif: [0-9]+.
Bulangan bulat negatif: -[0-9]+.
Sebuah bilangan positif jg dpt diberi tanda positif di depan angkanya.
krn + adlh sebuah karakter
meta, maka kita dpt memasukkannya ke dlm set atau mengawalinya dgn \ (garis miring terbalik, backslash) untuk
membuatnya menjadi bermakna literal. Contoh: [+]?[0-9]+

atau \+?[0-9]+.

Kedua
pola di atas dpt digabung menjadi pola untuk “bilangan bulat”: [+-]?[0-9]+.

Bilangan
desimal adlh bilangan bulat yg diikuti koma desimal. Polanya adlh sebagai
berikut: [+-]?[0-9]+(,[0-9]+)?
Atau bisa jg ditulis tanpa pengelompokan dgn pola ini: [+-]?[0-9]+,?[0-9]*. Perhatikan bahwa koma desimal bersifat opsional.

aku

^aku$

aku$

Sebuah variabel dlm PHP diawali dgn karakter $
dan diikuti dgn huruf besar, huruf kecil, atau garis bawah (_) namun tdk boleh angka. Huruf kedua dan seterusnya dpt berupa huruf, garis bawah, atau angka. Sebuah variabel
dpt terdiri dari satu atau lebih karakter. Polanya adlh sebagai berikut: $[A-Za-z_][A-Za-z_0-9]*

Perhatikan bahwa karakter $ di awal pola bukanlah karakter meta. Karakter meta memiliki arti khusus hanya
dlm konteks khusus aja. Jika karakter $
tdk ditaruh di akhir pola, maka tdk berarti jangkar, melainkan karakter
literal biasa.

tdk. krn pola berjangkar, maka potongan Mega atau Rahma harus terdapat di awal string yg ingin dicocokkan. dlm kasus ini, tdk cocok
krn awal string adlh Ibu.

Ya. Tepatnya, cocok dgn lapuk. Sekali lagi, perhatikan karakter meta bergantung pada konteks. Di dlm [ ] kebanyakan karakter meta menjadi bermakna literal. dlm kasus kita, karakter
meta ^ jika di awal pola berarti jangkar, namun di awal set berarti negasi. Maka pola [^k]apuk bertugas mencari potongan string
yg bukan diawali huruf k kecil dan diikuti apuk. Potongan
string lapuk cocok dgn pola ini.

Senin, 14 Februari 2011

Things You Can Do With PHP cURL

cURL, and its PHP extension libcURL, are tools which can be used to simulate a web browser. And there are lots you can do with PHP Curl, here are some of them:
1. Download a file
You can download a file using PHP cURL, and it will download using HTTP request:
set_time_limit(0); // set no time limit to download large file
ini_set('display_errors',true);//Just in case we get some errors, let us know....
 
$fp = fopen ('path to file', 'w+');//where the file will be saved
$ch = curl_init('http://somedomain.com/filename.zip');//Here is the file we are downloading
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);
2. Upload with HTTP or FTP protocol
You can upload a file using PHP cURL, and it will upload using HTTP or FTP:
Upload file using HTTP:
$postdata = array();
$postdata ['fieldname'] = "@/path/to/file.zip";  //fieldname should be same as file input box name
 
$post_url = 'http://somedomain.com/upload.php'; //url to upload file
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $post_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$response = curl_exec($ch);
curl_close ($ch);
Upload file using FTP:
$filepath = '/path/to/local/file.zip';
$fp = $fp = fopen($filepath, 'r'); //open as read a file
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'ftp://ftp_login:password@ftp.domain.com/'.'filaname.zip');
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filepath));
curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);
3. Shorten a URL using Bit.ly
Bit.ly is an URL shortener service, and it allow us to shorten url using their API. And we can connect to their API using PHP Curl:
$longurl='http://www.ivankristianto.com/';
$login='your bit.ly username';
$appkey='your app key';
$api_url = 'http://api.bit.ly/shorten?version=2.0.1&longUrl='.urlencode($longurl).'&format=xml&login='.$login.'&apiKey='.$appkey;
//call the API
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $api_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_ex_ec($curl);
curl_close($curl);
 
//parse the XML response and return the url
$xml_object = new SimpleXMLElement($response);
echo $xml_object->results->nodeKeyVal->shortUrl; //output the shortened url
4. Publish post to your WordPress blog
Wordpress blog have XMLRPC feature to publish a post and publish a comment. We can use cURL to connect to this WordPress blog XMLRPC and publish a post. See my previous post: [HowTo] Publish Post Via XML-RPC In WordPress.
5. Scrape the website content
Basically all the web content is in HTML. You can grap the website content and filter the content and grab the information you want to get. For example you can use cURL to grab the search result from Google, Bing, Yahoo and etc.
function getPage($proxy, $url, $referer, $agent, $header, $timeout) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, $header);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
 
    $result['EXE'] = curl_exec($ch);
    $result['INF'] = curl_getinfo($ch);
    $result['ERR'] = curl_error($ch);
    curl_close($ch);
    return $result;
}
 
$result = getPage(
    '[proxy IP]:[port]', // leave it blank of using no proxy
    'url to scrape start with http://',
    'referer url', // leave it blank if if no referer
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8',
    1,
    5);
 
//Process the $result['EXE'] here
6. Update your Facebook status
With cURL we can connect to Facebook and simulate as it is using a web browser and publish a status.
<?php
$status = 'YOUR_STATUS';
$first_name = 'YOUR_FIRST_NAME';
$login_email = 'YOUR_LOGIN_EMAIL';
$login_pass = 'YOUR_PASSWORD';
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php');
curl_setopt($ch, CURLOPT_POSTFIELDS,'email='.urlencode($login_email).'&pass='.urlencode($login_pass).'&login=Login');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_exec($ch);
 
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
$page = curl_exec($ch);
 
curl_setopt($ch, CURLOPT_POST, 1);
preg_match('/name="post_form_id" value="(.*)" \/>'.ucfirst($first_name).'/', $page, $form_id);
curl_setopt($ch, CURLOPT_POSTFIELDS,'post_form_id='.$form_id[1].'&status='.urlencode($status).'&update=Update');
curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
curl_exec($ch);
?>
7. Test your download speed connection
cURL have information of the connection status. You can grab the information and show you the how long the download time and how fast your download speed.
<?php error_reporting(E_ALL | E_STRICT);
 
// Initialize cURL with given url
$url = 'http://download.bethere.co.uk/images/61859740_3c0c5dbc30_o.jpg';
$ch = curl_init($url);
 
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 'Sitepoint Examples (thread 581410; http://www.sitepoint.com/forums/showthread.php?t=581410)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
 
set_time_limit(65);
 
$execute = curl_exec($ch);
$info = curl_getinfo($ch);
 
// Time spent downloading, I think
$time = $info['total_time']
      - $info['namelookup_time']
      - $info['connect_time']
      - $info['pretransfer_time']
      - $info['starttransfer_time']
      - $info['redirect_time'];
 
// Echo friendly messages
header('Content-Type: text/plain');
printf("Downloaded %d bytes in %0.4f seconds.\n", $info['size_download'], $time);
printf("Which is %0.4f mbps\n", $info['size_download'] * 8 / $time / 1024 / 1024);
printf("CURL said %0.4f mbps\n", $info['speed_download'] * 8 / 1024 / 1024);
 
echo "\n\ncurl_getinfo() said:\n", str_repeat('-', 31 + strlen($url)), "\n";
foreach ($info as $label => $value)
{
 printf("%-30s %s\n", $label, $value);
}
8. Get your adsense earning
Most blogger monetize his website using adsense, including me. You can grab your adsense earning using cURL:
Download the script. (Save it as php file)
Source from: http://planetozh.com/blog/my-projects/track-adsense-earnings-in-rss-feed/
9. Post to twitter
Twitter have their API, and we can use cURL to post our tweet to twitter through their API.
<?php
// Set username and password
$username = 'username';
$password = 'password';
// The message you want to send
$message = 'is twittering from php using curl';
// The twitter API address
$url = 'http://twitter.com/statuses/update.xml';
// Alternative JSON version
// $url = 'http://twitter.com/statuses/update.json';
// Set up and execute the curl process
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, "$url");
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_POST, 1);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, "status=$message");
curl_setopt($curl_handle, CURLOPT_USERPWD, "$username:$password");
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
// check for success or failure
if (empty($buffer)) {
    echo 'message';
} else {
    echo 'success';
}
?>
10. Download a video from YouTube
With cURL we can scrape the YouTube website to get the video url and download it.
Download the script here.

Send Message to Yahoo! Messenger from PHP

<?php
  // script name: send_message_to_yahoo_messenger.php
  // web scraper: Sony AK Knowledge Center - www.sony-ak.com
  // last update: July 20, 2010
 
  // get home page of yahoo mobile
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, "http://us.m.yahoo.com/w/bp-messenger");
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($curl, CURLOPT_ENCODING, "");
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14,52; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729)");
  curl_setopt($curl, CURLOPT_COOKIEJAR, getcwd() . '/cookies_yahoo_messenger.cookie');
  $curlData = curl_exec($curl);
  curl_close($curl);
 
  // debug: show the returned html
  // echo $curlData; exit;
 
  // get post url for login to yahoo
  $xml = $curlData;
  $xmlDoc = new DOMDocument();
  @$xmlDoc->loadHTML($xml);
 
  $urlPostLoginToYahoo = $xmlDoc->getElementsByTagName("form")->item(0)->getAttribute("action");
 
  foreach ($xmlDoc->getElementsByTagName("input") as $input) {
    if ($input->getAttribute("name") == "_done") {
      $_done = $input->getAttribute("value");
    }
    if ($input->getAttribute("name") == "_ts") {
      $_ts = $input->getAttribute("value");
    }
    if ($input->getAttribute("name") == "_crumb") {
      $_crumb = $input->getAttribute("value");
    }
  }
 
  // do login to yahoo messenger (mobile version)
  $yahoo_id = "your_yahoo_id";
  $yahoo_id_password = "your_yahoo_id_password";
 
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $urlPostLoginToYahoo);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, "_authurl=auth&_done=" . $_done . "&_sig=&_src=&_ts=" . $_ts . "&_crumb=" . $_crumb . "&_pc=&_send_userhash=0&_partner_ts=&id=" . $yahoo_id . "&password=" . $yahoo_id_password . "&__submit=Sign+in");
  curl_setopt($curl, CURLOPT_ENCODING, "");
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14,52; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729)");
  curl_setopt($curl, CURLOPT_COOKIEFILE, getcwd() . '/cookies_yahoo_messenger.cookie');
  curl_setopt($curl, CURLOPT_COOKIEJAR, getcwd() . '/cookies_yahoo_messenger.cookie');
  $curlData = curl_exec($curl);
  curl_close($curl);
 
  // get home page url for sending message
  $urlSendMessage = $curlData;
  $urlSendMessage = substr($urlSendMessage, strpos($urlSendMessage, "<a href=\"/w/bp-messenger/sendmessage") + 9);
  $urlSendMessage = substr($urlSendMessage, 0, strpos($urlSendMessage, "\""));
  $urlSendMessage = str_replace("&amp;", "&", $urlSendMessage);
  $urlSendMessage = "http://us.m.yahoo.com" . $urlSendMessage;
 
  // get home page of mobile messenger to send message
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $urlSendMessage);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($curl, CURLOPT_ENCODING, "");
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14,52; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729)");
  curl_setopt($curl, CURLOPT_COOKIEFILE, getcwd() . '/cookies_yahoo_messenger.cookie');
  curl_setopt($curl, CURLOPT_COOKIEJAR, getcwd() . '/cookies_yahoo_messenger.cookie');
  $curlData = curl_exec($curl);
  curl_close($curl);
 
  // debug: show the returned html
  // echo $curlData; exit;
 
  $xml = $curlData;
  $xmlDoc = new DOMDocument();
  @$xmlDoc->loadHTML($xml);
 
  $urlPostSendMessage = $xmlDoc->getElementsByTagName("form")->item(0)->getAttribute("action");
  $urlPostSendMessage = "http://us.m.yahoo.com" . $urlPostSendMessage;
 
  // do send message to yahoo messenger
  $yahoo_username = "sonyarianto"; // this is Yahoo! ID target
  $yahoo_message = "This is my message to you!"; // this is Yahoo! messenger message to the target
 
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $urlPostSendMessage);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, "id=" . $yahoo_username . "&message=" . $yahoo_message . "&__submit=Send");
  curl_setopt($curl, CURLOPT_ENCODING, "");
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14,52; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729)");
  curl_setopt($curl, CURLOPT_COOKIEFILE, getcwd() . '/cookies_yahoo_messenger.cookie');
  curl_setopt($curl, CURLOPT_COOKIEJAR, getcwd() . '/cookies_yahoo_messenger.cookie');
  $curlData = curl_exec($curl);
  curl_close($curl);
 
  echo "your message already sent to Yahoo! ID: " . $yahoo_username;
?>