Metakarakter ungkapan biasa dan peraturan padanan
Metacharacter
Metacharacter kali atau sebarang bilangan aksara sebelumnya. <<> + memadankan watak di hadapan atau lebih Pendekatan yang lebih standard ialah mengira mata sebagai atom. Padan dengan semua aksara kecuali n
^ haruslah 🎜>B Bukan sempadan <{> {m} tersedia dan hanya boleh muncul
{m,} sekurang-kurangnya m kali, bilangan maksimum bukan bilangan maksimum kali, bukan bilangan maksimum bukan Sekatan () Tukar keutamaan atau anggap rentetan sebagai a keseluruhan. Anda juga boleh menggunakannya untuk mengekstrak data yang dipadankan
+ Padankan aksara sebelumnya sekurang-kurangnya sekali
<?php $zz = '/\d+/'; $string = "迪奥和奥迪250都是我最爱"; //待会儿再试试中间没有0-9的情况 //$string = "迪奥和奥迪都是我最爱"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>berjaya dipadankan, membuktikan + dalam d+. d sepadan dengan nombor, dan + sepadan dengan aksara sebelumnya sekurang-kurangnya sekali.
* Memadankan 0 atau mana-mana bilangan aksara sebelumnya
<?php $zz = '/\w*/'; $string = "!@!@!!@#@!$@#!"; //待会儿再试试中间没有0-9的情况 //$string1 = "!@#!@#!abcABC#@#!"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
menunjukkan bahawa $string1 dan $string yang dikomen telah berjaya dipadankan. Kerana, w sepadan dengan 0-9A-Za-z_, dan * bermakna w sebelumnya tidak wujud. Jika ada boleh ada 1 atau lebih.
? Aksara sebelumnya muncul 0 atau 1 kali, pilihan
<?php $zz = '/ABC\d?ABC/'; $string = "ABC1ABC"; //待会儿再试试中间没有0-9的情况 //$string1 = "ABC888888ABC"; //$string2 = "ABCABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
sepadan dengan $string, $string2 berjaya, tetapi gagal untuk memadankan $string1.
Sebab ada ABC sebelum dan selepas padan, dan ada 0-9 di tengah 0-9 adalah pilihan, tetapi tidak boleh lebih daripada satu.
. (titik) Memadankan semua aksara kecuali n
<?php $zz = '/gg.+gg/'; $string = "ABC1ABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
sepadan dengan $string, $string2 berjaya, tetapi gagal untuk memadankan $string1.
Sebab ada ABC sebelum dan selepas padan, dan ada 0-9 di tengah 0-9 adalah pilihan, tetapi tidak boleh lebih daripada satu.
|. (bar menegak), atau, keutamaan terendah
Mari lihat melalui eksperimen padanan keutamaan dan atau
<?php $zz = '/abc|bcd/'; $string1 = "abccd"; $string2 = "ggggbcd"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Mari lihat Lihat:
1. Pada mulanya, idea pemadanan saya adalah abccd atau abbcd. Walau bagaimanapun, apabila $string1 dan $string2 dipadankan, hasil padanan adalah abc dan bcd
2. Ia tidak mempunyai keutamaan yang lebih tinggi daripada rentetan yang bersebelahan.
Maka persoalannya, apakah yang perlu saya lakukan jika saya ingin memadankan abccd atau abbcd dalam contoh di atas?
Anda perlu menggunakan () untuk menukar keutamaan.
<?php $zz = '/ab(c|b)cd/'; $string1 = "起来abccd阅兵"; $string2 = "ggggbcd"; $string3 = '中国abbcd未来'; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Hasilnya adalah seperti berikut:
dipadankan, hasilnya:
array (saiz=2)
0 => rentetan 'abccd' (panjang = 5)
1 => rentetan 'c' (panjang = 1)
Kesimpulan:
1) Ia sepadan dengan abccd atau abbcd ($string1 atau $string3).
2) Tetapi terdapat satu lagi elemen dalam tatasusunan yang sepadan, dan subskrip elemen ini ialah 1
3) Selagi kandungan dalam () berjaya dipadankan, data yang dipadankan akan diletakkan dalam Dalam elemen tatasusunan ini dengan indeks 1.
^ (circumflex), mesti bermula dengan rentetan selepas ^
<?php $zz = '/^好帅\w+/'; $string1 = "好帅abccdaaaasds"; //$string2没有以好帅开始 $string2 = "帅abccdaaaasds"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Kesimpulan berikut ditemui melalui eksperimen:
1) $string1 The perlawanan berjaya, tetapi $string2 tidak dipadankan
2) Kerana $string1 bermula dengan aksara yang ditentukan
3) dan $string2 tidak bermula dengan aksara selepas ^
Maksud terjemahan biasa ini ialah: mulakan dengan "be so handsome" diikuti dengan sekurang-kurangnya satu aksara a-zA-Z0-9_.
$ (tanda dolar) mesti diakhiri dengan watak sebelum $
<?php $zz = '/\d+努力$/'; $string1 = "12321124333努力"; //$string2 $string2 = "12311124112313力"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Mari kita jalankan dan lihat hasilnya dan buat kesimpulan:
$string1 berjaya dipadankan, tetapi $string2 tidak berjaya dipadankan. Watak sebelum
$ ialah d+, diikuti dengan usaha Cina.
Oleh itu, perlawanan ini adalah keseluruhannya. d merujuk kepada integer 0-9, dan tanda + mewakili sekurang-kurangnya satu 0-9
b dan B perkataan sempadan dan bukan perkataan sempadan
Apakah kami akan menerangkan Adakah sempadan:
1 Ungkapan biasa mempunyai sempadan ini adalah sempadan di mana permulaan dan akhir pembatas adalah tetap.
2 ini ialah perkataan Inggeris, diikuti dengan ruang, yang bermaksud perkataan itu telah tamat dan sempadan perkataan telah dicapai
b sempadan perkataan bermaksud ia mestilah di awal atau di akhir.
B bukan sempadan, iaitu, ia tidak boleh berada di hadapan atau terakhir ungkapan biasa.
<?php $zz = '/\w+\b/'; $string1 = "this is a apple"; $string2 = "thisis a apple"; $string3 = "thisisaapple"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Kesimpulan:
$string1, $string2 dan $string3 semuanya berjaya dipadankan.
Apabila $string1 sepadan, ruang ini adalah sempadan
Apabila $string2 sepadan, ini adalah sempadan
Apabila $string3 sepadan, thisisaapple mencapai penghujung keseluruhan ungkapan biasa. Begitu juga sempadan. Jadi perlawanan itu berjaya.
Mari bereksperimen dengan sempadan bukan perkataan:
<?php $zz = '/\Bthis/'; $string1 = "hellothis9"; //$string2 = "hello this9"; //$string2 = "this9中国万岁"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Ringkasan:
Berjaya memadankan $string1 tetapi $string2 gagal.
Oleh kerana B diikuti oleh ini, ini tidak boleh muncul pada sempadan perkataan (ruang dan permulaan dan akhir).
{m} boleh dan hanya boleh muncul m kali
<?php $zz = '/喝\d{3}酒/'; $string1 = "喝988酒"; //$string2 = "喝98811酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Kesimpulan:
Dalam contoh di atas, d{3} Saya menetapkan bahawa 0-9 hanya boleh muncul 3 kali, lebih sekali kurang Bukan sekali pun.
{n,m} boleh muncul n hingga m kali
<?php $zz = '/喝\d{1,3}酒/'; $string1 = "喝9酒"; //$string2 = "喝988酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Kesimpulan:
Dalam contoh di atas, saya menyatakan 0-9 untuk d{1, 3} Hanya boleh muncul sekali, 2 atau 3 kali. Semua masa lain adalah salah
{m,} sekurang-kurangnya m kali, bilangan maksimum tidak terhad
<?php $zz = '/喝\d{2,}/'; $string1 = "喝9"; //$string2 = "喝98"; //$string3 = "喝98122121"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Kesimpulan:
d{2,} dalam contoh di atas saya menetapkan bahawa nombor 0-9 selepas minuman muncul sekurang-kurangnya dua kali, dan tidak ada had untuk bilangan maksimum kali. Oleh itu, $string1 tidak berjaya padanan dan $string2 berjaya dipadankan. $string3 berjaya dipadankan.
Peraturan Pemadanan
Pemadanan Corak Asas
Semuanya bermula dari asas. Corak ialah elemen paling asas bagi ungkapan biasa Ia adalah satu set aksara yang menerangkan ciri-ciri rentetan. Corak boleh menjadi ringkas, terdiri daripada rentetan biasa, atau sangat kompleks, selalunya menggunakan aksara khas untuk mewakili julat aksara, ulangan atau untuk mewakili konteks. Contohnya:
^sekali
Corak ini mengandungi aksara khas ^, yang bermaksud corak itu hanya sepadan dengan rentetan itu bermula dengan sekali. Sebagai contoh, corak ini sepadan dengan rentetan "satu masa dahulu" tetapi tidak sepadan dengan "Ada seorang lelaki dari NewYork suatu ketika dahulu". Sama seperti simbol ^ menunjukkan permulaan, simbol $ digunakan untuk memadankan rentetan yang berakhir dengan corak tertentu.
baldi$
Corak ini sepadan dengan "Siapa yang menyimpan semua wang tunai ini dalam baldi" tetapi tidak sepadan dengan "baldi". Apabila aksara ^ dan $ digunakan bersama, ia mewakili padanan yang tepat (rentetan adalah sama dengan corak). Contohnya:
^baldi$
Hanya padan dengan rentetan "baldi". Jika corak tidak termasuk ^ dan $, maka ia sepadan dengan mana-mana rentetan yang mengandungi corak. Contohnya: corak
sekali
dengan tali
Pernah ada lelaki dari NewYork
Yang menyimpan semua wang tunainya dalam baldi.
ialah perlawanan.
Huruf (o-n-c-e) dalam corak ini ialah aksara literal, iaitu, ia mewakili huruf itu sendiri, begitu juga nombor. Aksara lain yang lebih kompleks, seperti tanda baca dan aksara putih (ruang, tab, dsb.), memerlukan urutan melarikan diri. Semua urutan melarikan diri bermula dengan garis miring ke belakang (). Urutan melarikan diri untuk watak tab ialah: t. Jadi jika kita ingin mengesan sama ada rentetan bermula dengan aksara tab, kita boleh menggunakan corak ini:
^t
Begitu juga, gunakan n untuk mewakili "Barisan baharu", r bermaksud pemulangan pengangkutan. Simbol khas lain boleh digunakan dengan garis miring belakang di hadapan Contohnya, garis miring ke belakang itu sendiri diwakili oleh \, noktah diwakili oleh ., dan seterusnya.
Kluster aksara
Dalam program INTERNET, ungkapan biasa biasanya digunakan untuk mengesahkan input pengguna. Apabila pengguna menyerahkan BORANG, ia tidak mencukupi untuk menggunakan aksara literal biasa untuk menentukan sama ada nombor telefon, alamat, alamat e-mel, nombor kad kredit, dsb. yang dimasukkan adalah sah.
Jadi kita perlu menggunakan cara yang lebih bebas untuk menerangkan corak yang kita mahu, iaitu gugusan aksara. Untuk mencipta gugusan yang mewakili semua vokal, letakkan semua vokal dalam kurungan segi empat sama:
[AaEeIiOoUu]
Corak ini sepadan dengan mana-mana aksara vokal, tetapi hanya boleh mewakili satu watak. Gunakan sempang untuk mewakili julat aksara, seperti:
[a-z] // Padankan semua huruf kecil
[A-Z] // Padankan semua huruf besar
[a- zA- Z] //Padankan semua huruf
[0-9] //Padankan semua nombor
[0-9.-] //Padankan semua nombor, noktah dan tanda tolak
[ frtn ] //Padankan semua aksara putih
Sekali lagi, ini hanya mewakili satu watak, yang sangat penting. Jika anda ingin memadankan rentetan yang terdiri daripada huruf kecil dan digit, seperti "z2", "t6" atau "g7", tetapi bukan "ab2", "r2d3" atau "b52", gunakan corak ini:
^[a-z][0-9]$
Walaupun [a-z] mewakili julat 26 huruf, di sini ia hanya boleh digunakan dengan Rentetan pertama padanan di mana aksara ialah huruf kecil.
Telah disebut sebelum ini bahawa ^ mewakili permulaan rentetan, tetapi ia juga mempunyai makna lain. Apabila ^ digunakan dalam set kurungan segi empat sama, ia bermaksud "tidak" atau "kecualikan" dan selalunya digunakan untuk menghapuskan aksara tertentu. Menggunakan contoh sebelumnya, kami memerlukan aksara pertama tidak boleh menjadi nombor:
^[^0-9][0-9]$
Corak ini sepadan dengan "&5", "g7" dan "-2", tetapi tidak sepadan dengan "12" dan "66". Berikut ialah beberapa contoh mengecualikan aksara tertentu:
[^a-z] //Semua aksara kecuali huruf kecil
[^\/^] //Semua aksara kecuali ()(/)(^)
[^" '] //Semua aksara kecuali petikan berganda (") dan petikan tunggal (')
Aksara khas "." (titik, noktah) digunakan dalam ungkapan biasa Mewakili semua aksara kecuali "baris baharu". Jadi corak "^.5$" sepadan dengan mana-mana rentetan dua aksara yang berakhir dengan nombor 5 dan bermula dengan beberapa aksara bukan "baris baharu" yang lain. Corak "." boleh memadankan mana-mana rentetan, kecuali rentetan kosong dan rentetan yang mengandungi hanya "baris baharu".
Ungkapan biasa PHP mempunyai beberapa kelompok aksara biasa terbina dalam, senarainya adalah seperti berikut:
Kluster Aksara 🎜>[[:alpha:]] Mana-mana huruf
[[:alnum:]] Mana-mana huruf dan nombor
[[:space:]] mana-mana aksara ruang putih
[[:upper:]] mana-mana huruf besar
[[:lower:]] mana-mana huruf kecil
[[:punct:]] Mana-mana tanda baca tandakan
[[:xdigit:]] Sebarang nombor heksadesimal, bersamaan dengan [0-9a-fA-F]
Kenal pasti penduaSekarang anda sudah tahu cara memadankan huruf atau nombor, tetapi lebih banyak lagi Dalam kebanyakan kes, anda mungkin mahu memadankan perkataan atau sekumpulan nombor. Satu perkataan terdiri daripada beberapa huruf, dan sekumpulan nombor terdiri daripada beberapa nombor tunggal. Tanda kurung kerinting ({}) berikutan aksara atau kelompok aksara digunakan untuk menentukan bilangan kali kandungan sebelumnya diulang. gugusan aksara
Penerangan^[a-zA-Z_]$ Semua huruf dan garis bawah
^a$ Huruf a
^a{4} $ aaaa
^a{2,4}$ aa,aaa atau aaaa
^a{1,3}$ a,aa atau aaa
^a{2 ,}$ Rentetan yang mengandungi lebih daripada dua a
^a{2,} Seperti: aardvark dan aaab, tetapi bukan epal
a{2,} Seperti: baad dan aaa, Tetapi Nantucket tidak' t berfungsi
t{2} dua aksara tab
.{2} kedua-dua aksara
Contoh ini menerangkan tiga kegunaan berbeza pendakap kerinting. Nombor, {x} bermaksud "kluster aksara atau aksara sebelumnya muncul hanya x kali"; ,y} bermaksud "kandungan sebelumnya muncul sekurang-kurangnya x kali, tetapi tidak lebih daripada y kali". Kita boleh memanjangkan corak kepada lebih banyak perkataan atau nombor:
^[a-zA-Z0-9_]{1,}$ //Semua mengandungi lebih daripada satu huruf, nombor atau Rentetan garis bawah
^[1-9]{1,}$ //Semua nombor positif
^-{0,1}[0-9]{1,}$ //Semua integer
^[-]?[ 0-9]+.?[0-9]+$ //Semua nombor titik terapung
Contoh terakhir tidak mudah difahami, bukan? Lihatlah dengan cara ini: dengan segala-galanya bermula dengan tanda tolak pilihan ([-]?) (^), diikuti dengan 1 atau lebih digit ([0-9]+), dan diikuti dengan titik perpuluhan (.) 1 atau lebih digit ([0-9]+) dan tidak diikuti oleh apa-apa lagi ($). Di bawah ini anda akan belajar tentang kaedah yang lebih mudah yang boleh anda gunakan.
Aksara khas "?" adalah sama dengan {0,1}, kedua-duanya mewakili: "0 atau 1 kandungan sebelumnya" atau "kandungan sebelumnya adalah pilihan". Jadi contoh tadi boleh dipermudahkan kepada:
^-?[0-9]{1,}.?[0-9]{1,}$
Aksara khas "*" adalah sama dengan {0,}, kedua-duanya mewakili "0 atau lebih kandungan sebelumnya". Akhir sekali, aksara "+" adalah bersamaan dengan {1,}, yang bermaksud "1 atau lebih kandungan sebelumnya", jadi 4 contoh di atas boleh ditulis sebagai:
^[a-zA - Z0-9_]+$ //Semua rentetan yang mengandungi lebih daripada satu huruf, nombor atau garis bawah
^[0-9]+$ //Semua nombor positif
^-?[0-9] +$ // Semua integer
^-?[0-9]*.?[0-9]*$ //Semua nombor titik terapung
Sudah tentu ini tidak berfungsi Secara teknikal mengurangkan kerumitan ungkapan biasa, tetapi menjadikannya lebih mudah dibaca.