Jumat, 07 Januari 2011

Menggunakan Regular Expressions dengan PHP

Ekspresi reguler adalah alat yang ampuh untuk memeriksa dan memodifikasi teks. Ekspresi reguler sendiri, dengan pola umum notasi hampir seperti bahasa pemrograman mini, memungkinkan Anda untuk menggambarkan dan mengurai teks. Mereka memungkinkan Anda untuk mencari pola dalam string, penggalian cocok fleksibel dan tepat.Namun, yang harus dicatat bahwa karena ekspresi reguler lebih kuat, mereka juga lebih lambat dibandingkan dengan fungsi string yang lebih mendasar. Oleh karena itu Anda harus menggunakan kalimat biasa jika Anda memiliki kebutuhan tertentu.

PHP mendukung dua jenis ekspresi reguler: Regular Expressions POSIX-extended dan Perl-Compatible (PCRE). Fungsi-fungsi PCRE lebih kuat daripada yang POSIX, dan lebih cepat juga, jadi kita akan berkonsentrasi pada mereka.

Dasar-dasar:
Dalam ekspresi reguler, karakter paling cocok hanya dirinya sendiri. Misalnya, jika Anda mencari "foo" ekspresi regular dalam string "John bermain sepak bola," Anda mendapatkan pertandingan karena "foo" terjadi dalam string tersebut. Beberapa karakter memiliki arti khusus dalam ekspresi reguler. Misalnya, tanda dolar ($) digunakan untuk mencocokkan string yang berakhir dengan pola yang diberikan. Demikian pula, sebuah tanda caret (^) karakter pada awal ekspresi reguler menunjukkan bahwa ia harus cocok dengan awal string. Karakter yang cocok sendiri disebut literal. Karakter yang memiliki arti khusus disebut metakarakter.

Dot (.) mencocokkan setiap karakter tunggal kecuali newline (\). Jadi, pola h.t sesuai dengan hat, hothit, hut, h7t dll. Tanda pipa vertikal (|) metakarakter digunakan untuk alternatif dalam ekspresi reguler. Ini berperilaku seperti operator logika OR dan Anda harus menggunakannya jika Anda ingin membangun sebuah pola yang cocok dengan lebih dari satu set karakter. Misalnya, pola Utah | Idaho | Nevada cocok dengan string yang berisi "Utah" atau "Idaho" atau "Nevada". Tanda kurung memberi kita cara untuk urutan kelompok. Sebagai contoh, (Nant|b)ucket cocok "Nantucket" atau "bucket". Menggunakan tanda kurung ke grup bersama karakter untuk pergantian disebut pengelompokan.
Jika Anda ingin mencocokkan semua metakarakter literal dalam pola, anda harus menggunakan garis miring terbalik (\)

Untuk menetapkan satu set karakter diterima dalam pola Anda, Anda dapat membangun sebuah kelas karakter sendiri atau menggunakan satu standar. Sebuah kelas karakter memungkinkan Anda mewakili sekelompok karakter sebagai item tunggal dalam ekspresi reguler. Anda dapat membangun kelas karakter Anda sendiri dengan melampirkan karakter yang diterima dalam tanda kurung persegi. Sebuah kelas karakter cocok salah satu karakter di kelas. Misalnya kelas karakter [abc] cocok dengan a, b, atau c. Untuk menentukan berbagai karakter, hanya menempatkan karakter pertama dan terakhir lalu dipisahkan dengan tanda hubung. Misalnya, untuk mencocokkan semua karakter alfanumerik: [a-zA-Z0-9]. Anda juga dapat membuat kelas menegasikan karakter, yang sesuai dengan setiap karakter yang bukan di kelas. Untuk membuat karakter menegasikan kelas, mulai kelas karakter dengan ^: [^ 0-9].

Metakarakter +, *, ?, dan {} Mempengaruhi berapa kali pola harus dicocokkan.
+ Berarti "Cocok satu atau lebih dari ekspresi sebelumnya",
* berarti "Cocok nol atau lebih dari ekspresi sebelumnya",
? berarti "Cocok nol atau satu dari ekspresi sebelumnya".
Kurung kurawal {} dapat digunakan berbeda. Dengan bilangan bulat, {n} berarti "sama persis n kejadian dari ekspresi sebelumnya", dengan satu bilangan bulat dan koma, {n,} berarti "cocok n atau kejadian lebih dari ekspresi sebelumnya", dan dengan dua dipisahkan dengan koma {bilangan bulat n, m} berarti "sesuai dengan karakter sebelumnya jika terjadi setidaknya n kali, tapi tidak lebih dari kali m".

Sekarang, kita lihat tabel berikut:

Regular Expression Will match...
foo The string "foo"
^foo "foo" at the start of a string
foo$ "foo" at the end of a string
^foo$ "foo" when it is alone on a string
[abc] a, b, or c
[a-z] Any lowercase letter
[^A-Z] Any character that is not a uppercase letter
(gif|jpg) Matches either "gif" or "jpeg"
[a-z]+ One or more lowercase letters
[0-9\.\-] Аny number, dot, or minus sign
^[a-zA-Z0-9_]{1,}$ Any word of at least one letter, number or _
([wx])([yz]) wy, wz, xy, or xz
[^A-Za-z0-9] Any symbol (not a number or a letter)
([A-Z]{3}|[0-9]{4}) Matches three letters or four numbers

Expressions Perl-Compatible Regular meniru sintaks Perl untuk pola, yang berarti bahwa setiap pola harus diapit sepasang pembatas. Biasanya karakter yang digunakan yaitu, slash (/). Sebagai contoh, /pola/.

Fungsi-fungsi PCRE dapat dibagi dalam beberapa kelas yaitu: matching (pencocokan), replacing (menggantikan), splitting (membelah) dan filtering (penyaringan).

Minggu, 05 Desember 2010

Menggunakan Header PHP Untuk Force Download

phpSering kali, saat membuat situs web, Anda mungkin menghadapi situasi di mana Anda ingin menyediakan file untuk di download. Sepintas kita bayangkan hal tersebut cukup mudah, yaitu kita hanya perlu membuat link menuju file di server kita. Namun permasalahannya dalam metode sederhana ini pada kenyataannya tidak sesuai yang diharapkan, karena setiap browser, platform, dll, dapat menangani berbagai macam jenis file dengan cara yang berbeda.

Sebagai contoh, katakanlah Anda memiliki file mp3 dari hit single terbaru Anda, dan anda ingin berbagi file tersebut dengan pengunjung situs. Anda dapat dengan hanya membuat link menuju file tersebut:
<a href="mysong.mp3">Download My Hit Single</a>
Yang jadi masalah dengan metode ini adalah bahwa sebagian besar browser memiliki kemampuan untuk memutar file mp3. Oleh karena itu, mereka akan secara otomatis mengisi Quicktime, atau plug-in lainnya dan mulai men-download file di browser mereka. Dengan demikian mereka tidak akan mendapatkan file tersebut di hard drive. pengunjung situs seperti anda hanya dapat menikmati file tersebut dari browser. Nah, dengan bahasa pemrograman PHP, kita dapat dengan cepat mengatasi hal tersebut.
Fungsi magis untuk melakukannya adalah header() function. Fungsi ini memungkinkan kita untuk mendefinisikan header HTTP baku sebagai string. Script kemudian akan mengeksekusi fungsi header dan memaksa browser untuk membuat halaman yang di inginkan.

hal yang pertama dilakukan kita perlu menentukan path ke file kita di PHP (sebagai string).
<?PHP
    // Define the path to file
    $file = 'mysong.mp3';
?>
Setelah kita memiliki path file kita pasti, Sekarang kita harus mengecek untuk memastikan bahwa itu benar-benar ada sebelum melanjutkan. Jika file tidak ada kita akan menampilkan pesan kesalahan ke layar browser.
if(!file_exists($file)))
{
    die('Error: File not found.');
}
Sekarang kita telah melewati cek ini, waktunya untuk pindah ke bagian kedua yaitu di mana kita mendefinisikan semua header kita.
else
{
    // Set headers
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: binary");
}
Kebanyakan dari parameter ini header cukup jelas. Yang penting di sini adalah file Transfer, attachment, and application/zip definitions. "Content-Description: File Transfer" akan membantu pengguna untuk medownload file. Definisi dari "Content-Disposition: attachment" pada baris berikutnya, untuk memberitahu browser bahwa kita memang akan menuju link ke file. Baris berikutnya, "Content-Type", memberitahu browser jenis aplikasi dasar file sebagai referensi.

Sekarang kita sudah memiliki semua header, apa yang kita lakukan? Yah sederhananya, kita membuka file menggunakan readfile() function. Ini benar-benar akan menjadi tempat di dalam tanda kurung kurawal lain.
// Read the file from disk
    readfile($file);
Kode yang sudah selesei terlihat seperti:
<?PHP
 // Define the path to file
 $file = 'ryboe_tag_cloud.zip';
 
 if(!file)
 {
     // File doesn't exist, output error
     die('file not found');
 }
 else
 {
     // Set headers
     header("Cache-Control: public");
     header("Content-Description: File Transfer");
     header("Content-Disposition: attachment; filename=$file");
     header("Content-Type: application/zip");
     header("Content-Transfer-Encoding: binary");
    
     // Read the file from disk
     readfile($file);
 }
 ?>
Jadi dari kode tersebut, kita memaksa untuk download file melalui file PHP. Ini benar-benar membuka banyak jalan dalam aplikasi web Anda karena sekarang Anda bisa membuat link download anda dinamis dan bahkan menambahkan pelacakan stat maju melalui database.