Untuk mengantisipasi dimulainya utas baru pada kursus "Backend-developer in PHP" , serta kursus terkait "Framework Laravel" , kami ingin berbagi artikel yang disiapkan oleh penulis lepas kami.
Perhatian! Artikel ini tidak relevan dengan program kursus dan hanya akan bermanfaat bagi pemula . Untuk pengetahuan yang lebih mendalam, kami mengundang Anda untuk mengunjungi intensif online dua-hari gratis dengan topik: "Membuat bot Telegram untuk memesan kopi di suatu institusi dan membayar online . " Hari kedua yang intens akan diadakan di sini .

Halo semuanya! Semua dengan
[20]{2,}0
tahun mendatang. Hari ini saya ingin menyentuh pada topik yang kadang menjadi topik lelucon dari "Mengapa Anda perlu mempelajari semua ini jika Anda sudah memiliki solusi siap pakai" untuk "Anda juga dapat mempelajari semua Perl?" Namun, seiring berjalannya waktu, banyak programmer mulai menguasai ekspresi reguler, dan pada HabrΓ© tidak ada artikel baru (
walaupun ekspresi reguler tidak banyak berubah belakangan ini ) tentang topik ini. Saatnya menulis yang lain!
Ekspresi reguler dalam isolasi dari implementasi spesifik mereka
Ekspresi reguler (dilambangkan dalam bahasa Inggris sebagai
RegEx atau sebagai
regex ) adalah alat yang digunakan untuk berbagai opsi untuk mempelajari dan memproses teks: mencari, memeriksa, mencari dan mengganti elemen yang terdiri dari huruf atau angka (atau karakter lain dalam termasuk karakter khusus dan karakter tanda baca). Awalnya, ekspresi reguler datang ke dunia pemrograman dari lingkungan penelitian ilmiah, yang dilakukan pada 50-an di bidang matematika.
Beberapa dekade kemudian, prinsip-prinsip dan ide-ide dipindahkan ke lingkungan sistem operasi UNIX (khususnya, mereka dimasukkan dalam utilitas
grep
) dan diimplementasikan dalam bahasa pemrograman Perl, yang pada awal Internet digunakan secara luas pada backend (dan hingga hari ini digunakan, tetapi sudah kurang) untuk tugas seperti itu. seperti validasi formulir.

Jika mereka tampak sederhana, lalu mengapa mereka begitu menakutkan pada pandangan pertama?
Bahkan, ekspresi apa pun bisa "biasa" dan dapat digunakan untuk memeriksa atau mencari karakter apa pun. Misalnya, kata-kata
Pavel atau
example@mail.ru juga dapat digunakan sebagai pelanggan tetap, hanya saja, dengan kunci yang agak sempit. Untuk menguji kinerja ekspresi reguler di lingkungan PHP tanpa memulai server atau hosting Anda, Anda dapat menggunakan
layanan online berikut (itu hanya tidak berfungsi dengan memproses karakter Rusia di dalamnya). Sebagai permulaan, kami hanya menggunakan
Pavel sebagai ekspresi reguler.
Misalkan kita memiliki teks berikut:
Pavel tahu terlalu banyak.
Pavel menggunakan nginx dan dia bukan rambler.
Sekarang ekspresi reguler telah menemukan kedua kemunculan kata Pavel. Ini hebat, tetapi itu tidak terdengar sangat berguna (kecuali karena alasan tertentu Anda mencoba menganalisis sesuatu seperti jumlah kata yang disebutkan dalam Perang dan Damai melalui Vim dan Python, tetapi kemudian saya tidak memiliki pertanyaan untuk Anda).
Variabilitas ekspresi
Jika ekspresi reguler Anda adalah variabel (misalnya, Anda hanya tahu bagian tertentu dan perlu mencari jumlah kemunculan tahun, mulai dari 2000 dan berakhir dengan 2099), maka kita dapat menggunakan ekspresi reguler berikut:
20 ..Teks: Penulis muda menulis banyak hal. Sebagai contoh, seorang penulis yang lahir pada tahun 2002 sangat berbeda dari tahun 2008 dan 2012.Di sini, dengan bantuan ekspresi reguler, kita dapat menemukan semua tahun, tetapi sejauh ini tidak masuk akal. Kemungkinan besar, kita tidak perlu bertahun-tahun setelah 2012 (walaupun penulis muda di bawah 8 tahun mungkin tersinggung, tetapi tidak tentang itu sekarang). Ada baiknya mempelajari rangkaian karakter, tetapi lebih lanjut tentang itu nanti, karena sekarang kita akan berbicara tentang bagian penting lain dari ekspresi reguler: keluar dari karakter meta.
Bayangkan kita perlu menemukan jumlah kemunculan file dengan ekstensi
.doc
(misalkan kita hanya mengekspor file tertentu yang diunggah ke basis data kita). Tetapi apakah sebuah titik berarti karakter apa saja? Jadi apa yang harus dilakukan?
Di sini, melarikan karakter meta dengan backslash datang ke bantuan kami. Sekarang ekspresi
\.doc
akan cukup berhasil untuk mencari teks yang disebutkan dengan ekstensi
.doc
:
Ekspresi reguler:
\.doc
Teks: kursach
.doc ,
nepodozritelneyfail.exe
, kerja
.doc ,
shaprgalka.rtf doc
Seperti yang Anda lihat, kita dapat berhasil menemukan jumlah file dengan ekstensi
.doc
dalam daftar. Namun, kami tidak dapat mengeluarkan nama file lengkap menggunakan ekspresi reguler ini, misalnya, ke dalam array. Saatnya untuk melihat set karakter.
Cocokkan seluruh rangkaian karakter
Dalam ekspresi reguler, pencocokan dengan set disediakan menggunakan metacharacters - tanda kurung
[ ]
. Dua karakter ASII apa pun dapat ditentukan sebagai awal dan akhir rentang. Untuk implementasi sederhana, misalkan kita ingin menemukan semua file bernomor dari 0 hingga 9 dengan ekstensi
.jpg
.
Ekspresi reguler:
[0-9]\.jpg
Teks:
1.jpg ,
2.jpg ,
3.jpg , photo.jpg, anime.jpg,
8.jpg , jkl.jpg
Perlu dicatat bahwa nama file lebih dari 1 digit tidak akan tercakup oleh ekspresi reguler kami. Tentang pilihan ganda akan sedikit lebih rendah, tetapi untuk sekarang bayangkan bahwa kita tiba-tiba diperlukan untuk mencapai hasil yang berlawanan. Tambahkan metacharacter
^
(yang, sebaliknya, memiliki sebanyak dua fungsi dalam ekspresi reguler). Untuk menggunakannya sebagai pengecualian, Anda harus menambahkannya ke set kami:
Ekspresi reguler:
[^0-9]\.jpg
Teks: 1.jpg, 2.jpg, 3.jpg, phot
o.jpg , anim
e.jpg , 8.jpg, jk
l.jpgTetapi tanpa pilihan ganda, ini tentu saja ekspresi yang lebih rendah.
Tabel Berguna
Berikut ini adalah tabel karakter:
Tabel putih metakarakter ruang
Pilihan Ganda: Membuat Validasi Sederhana
Berbekal pengetahuan yang diperoleh, kami akan mencoba membuat ekspresi reguler yang menemukan, misalnya, kata-kata yang lebih pendek dari 3 huruf (tugas standar untuk anti-spam). Jika kami mencoba menggunakan ekspresi reguler berikut -
\w{1,3}
(di mana metacharacter
\w
menunjukkan karakter apa pun, dan tanda kurung keriting menunjukkan jumlah karakter dari berapa banyak hingga berapa banyak, maka kami akan menyorot semua karakter secara berturut-turut - Anda perlu menunjuk entah bagaimana awal dan akhir kata dalam teks, untuk ini kita perlu metacharacter
\b
.
Ekspresi reguler:
\b\w{1,3}\b:
Teks: kata yang bagus
tidaktelurTidak buruk! Sekarang kata-kata yang lebih pendek dari tiga huruf tidak akan dapat masuk ke database kami. Mari kita lihat validasi alamat surat:
Ekspresi reguler:
\w+@\w+\.\w+
Persyaratan: di email di awal harus berupa karakter apa saja (angka atau huruf, karena email, yang hanya terdiri dari angka di awal, sangat umum). Kemudian muncul simbol
@
, lalu sebanyak karakter yang Anda suka, diikuti oleh titik yang diloloskan (mis. Hanya satu titik) dan domain tingkat pertama.
Pertimbangkan pengulangan karakter secara lebih rinci.
Sekarang mari kita lihat lebih dekat bagaimana mengulangi karakter dalam ekspresi reguler. Misalnya, Anda ingin menemukan kombinasi angka dari 2-6 dalam teks:
Ekspresi Reguler:
[2-6]+
Teks: Berikut 89 89
234 angka
24 .
Biarkan saya memberi Anda tabel dari semua penjelas metacharacter:
Tidak ada yang rumit dalam menerapkan penjumlahan. Kecuali untuk satu peringatan: quantifier serakah dan malas. Ini tabelnya:
Kuantitas malas berbeda dari serakah karena mereka mengambil jumlah karakter minimum, bukan maksimum. Bayangkan bahwa kita memiliki tugas untuk menemukan semua tag tajuk h1-h6 dan kontennya, dan teks lainnya tidak boleh terpengaruh (saya sengaja memasukkan tag h7 yang tidak ada agar tidak tersiksa karena lolos dari tag Habra):
Ekspresi reguler: <h [1-7]>. *? <\ / H [1-7]>
Teks:
<
h7
>
halo </
h7
>
lorem ipsum avada kedavra
<
h7
> beli <
/h7
>
Semuanya bekerja dengan sukses, tetapi hanya berkat kuantifier malas. Dalam hal menggunakan quantifier serakah, semua teks di antara tag akan menonjol (saya pikir ini tidak perlu ilustrasi).
Perbatasan String Karakter
Batas-batas string karakter yang telah kita gunakan di atas. Ini adalah tabel yang lebih detail:
Bekerja dengan subekspresi
Subekspresi dalam ekspresi reguler dilakukan menggunakan grup metacharacter
()
.
Berikut adalah contoh ekspresi reguler yang secara universal dapat menemukan berbagai variasi alamat IP.
Ekspresi reguler: (((25 [0-5]) | (2 [0-4] \ d) | (1 \ d {2}) | (\ d {1,2})) \.) {3} (((25 [0-5] | (2 [0-4] \ d) | (1 \ d {2}) | (\ d {1,2})))))
Teks:
255.255.255.255 hanyalah sebuah alamat
191.198.174.192 wikipedia
87.240.190.67 vk
31.13.72.36 facebook
Ini menggunakan operator logis
|
(atau) yang memungkinkan kami untuk membuat ekspresi reguler yang cocok dengan aturan yang digunakan untuk mengkompilasi alamat IP. Alamat IP harus berisi dari 1 hingga 3 digit, di mana sejumlah tiga angka dapat dimulai dengan 1, dengan 2 (atau kemudian digit kedua harus antara 0 dan 4), atau mulai dengan 25, dan kemudian 3 digit ternyata antara 0 dan 5. Juga, harus ada titik di antara setiap kombinasi angka. Dengan menggunakan tabel di atas, cobalah untuk menguraikan ekspresi reguler di atas. Ekspresi reguler di awal menakut-nakuti Anda dengan panjang, tetapi panjang tidak berarti kompleks.
Lihat ke depan
Untuk melihat ekspresi kombinasi karakter tertentu, sebuah pola ditunjukkan dengan kecocokan yang terdeteksi, tetapi tidak dikembalikan. Pada dasarnya, melihat ke depan mendefinisikan subekspresi dan oleh karena itu dibentuk sesuai. Pola sintaksis untuk melihat ke depan terdiri dari subekspresi yang didahului oleh? =, Dan kemudian teks yang akan dicocokkan diikuti dengan sama.
Ini adalah tugas khusus: ada kata sandi yang harus terdiri dari setidaknya 7 karakter dan harus menyertakan setidaknya satu huruf besar dan angka. Di sini semuanya akan menjadi sedikit lebih rumit, karena pengguna harus dapat meletakkan huruf besar baik di awal dan di tengah kalimat (dan hal yang sama harus diulang dengan huruf).
Karena itu, kita perlu melihat ke depan ungkapan itu. Selain itu, kita perlu memecah tanda menjadi kelompok. Dan saya ingin membatasi ukurannya dari 8 hingga 22 karakter:
Ekspresi reguler:
/^(?=.*[az])(?=.*[AZ])(?=.*\d)[a-zA-Z\d]{8,}$/
Teks:
Qwerty123Im789098kata sandi lemah
Fitur kerja ekspresi reguler di PHP
Untuk mempelajari cara kerja ekspresi reguler dalam PHP, lihat fungsi dalam dokumentasi PCRE resmi (Perl Kompatibel dengan Ekspresi Reguler), yang tersedia di situs web resmi. Ekspresi harus dilampirkan dalam pembatas, misalnya, dalam garis miring ke depan.
Karakter sewenang-wenang dapat menjadi pembatas, kecuali alfanumerik, garis miring terbalik '\' dan byte nol. Jika karakter pembatas muncul dalam pola, itu harus lolos \. Sebagai pemisah, kombinasi berasal dari Perl: (), {}, [].
Fungsi apa yang digunakan dalam php? Paket PCRE menyediakan fitur berikut untuk mendukung ekspresi reguler:
- preg_grep () - Melakukan pencarian dan mengembalikan array yang cocok.
- preg_match () - mencari kecocokan pertama menggunakan ekspresi reguler
- preg_match_all () - Melakukan pencarian global menggunakan ekspresi reguler
- preg_quote () - mengambil templat dan mengembalikan versinya yang lolos
- preg_replace () - melakukan pencarian dan mengganti operasi
- preg_replace_callback () - juga melakukan pencarian dan mengganti operasi, tetapi mereka menggunakan panggilan balik - suatu fungsi untuk setiap penggantian spesifik
- preg_split () - membagi string karakter ke dalam substring
Pengubah
i
untuk mengatur kecocokan tanpa sensitivitas case.
Dengan menggunakan pengubah
m
, Anda dapat mengaktifkan mode pemrosesan teks multiline.
Mengganti string dapat dihitung sebagai kode PHP. Untuk mengaktifkan mode ini, gunakan pengubah
e .
Semua
preg_split()
preg_replace()
,
preg_replace_callback()
dan
preg_split()
mendukung argumen tambahan, yang memperkenalkan batasan jumlah maksimum penggantian atau partisi.
Tautan balik dapat ditunjukkan dengan tanda $ (misalnya, $ 1), dan di versi sebelumnya, tanda-tanda \\ digunakan sebagai ganti tanda $.
Metakarakter \ E, \ l, \ L, \ u dan \ U tidak digunakan (oleh karena itu, mereka tidak disebutkan dalam artikel ini).
Artikel kami tidak akan lengkap tanpa kelas karakter POSIX, yang juga berfungsi dalam PHP (dan secara umum dapat meningkatkan keterbacaan pelanggan tetap Anda, tetapi tidak semua dari mereka terburu-buru untuk belajar, karena mereka sering mematahkan logika ekspresi).
Pada akhirnya saya akan memberikan contoh implementasi konkret dari ekspresi reguler di PHP, menggunakan implementasi yang disebutkan di atas. Saya juga menambahkan validasi nama pengguna sehingga ia tidak bisa memasukkan kombinasi huruf terlalu pendek (well, anggap ini adalah nama panggilan, bukan nama, nama lebih pendek dari dua huruf):
$pattern_name = '/\w{3,}/'; $pattern_mail = '/\w+@\w+\.\w+/'; $pattern_password = '/^(?=.*[az])(?=.*[AZ])(?=.*\d)[a-zA-Z\d]{8,}$/'; if (preg_match($pattern_name, $name) && preg_match($pattern_mail, $mail) && preg_match($pattern_password, $_POST['password'])) {
Terima kasih atas perhatian Anda! Tentu saja, hari ini kita hanya menyentuh sebagian dari ekspresi reguler dan beberapa artikel lagi dapat ditulis tentangnya. Misalnya, kami tidak membicarakan implementasi pencarian pengulangan kata-kata yang identik dalam teks. Tetapi saya berharap bahwa pengetahuan yang diperoleh cukup untuk secara bermakna menulis validasi formulir pertama saya dan baru kemudian beralih ke hal-hal yang lebih ganas.
Secara tradisi, beberapa tautan bermanfaat:Lembar Curang Ekspresi Reguler MIT
Bagian resmi dari
dokumentasi regex php.
Itu saja. Sampai jumpa di intensif !Hari kedua yang intens akan diadakan di sini