Kami telah melengkapkan pengenalan kepada ungkapan ungkapan biasa melalui metakarakter dan atom. Terdapat beberapa situasi istimewa yang masih perlu kita hadapi.
Bagaimana untuk memadankan jika abc berada di permulaan baris kedua?
Saya tidak mahu ungkapan biasa menjadi sangat tamak dalam memadankan semua, apakah yang perlu saya lakukan jika ia hanya sepadan dengan sebahagian daripadanya?
Pada masa ini, kita perlu menggunakan padanan corak berikut untuk meningkatkan fungsi biasa.
Watak padanan corak yang biasa digunakan ialah:
模式匹配符 | 功能 |
---|---|
i | 模式中的字符将同时匹配大小写字母. |
m | 字符串视为多行 |
s | 将字符串视为单行,换行符作为普通字符. |
x | 将模式中的空白忽略. |
A | 强制仅从目标字符串的开头开始匹配. |
D | 模式中的美元元字符仅匹配目标字符串的结尾. |
U | 匹配最近的字符串. |
watak padanan corak adalah seperti berikut:
/ Ungkapan ekspresi biasa/Watak padanan corak Watak padanan corak
diletakkan di hujung ayat ini. Contohnya:
/w+/s
Kami tahu formatnya dengan jelas Perkara paling penting seterusnya ialah mengukuhkan pemahaman dan ingatan penggunaan aksara padanan corak . Kami menggunakan kod untuk memahami perbezaan antara menambah dan tidak menambah padanan corak.
i tidak sensitif huruf besar kecil
<?php //在后面加上了一个i $pattern = '/ABC/i'; $string = '8988abc12313'; $string1 = '11111ABC2222'; if(preg_match($pattern, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
Kesimpulan, kedua-dua $string dan $string1 telah berjaya dipadankan. Oleh itu, selepas menambah i pada akhir, kes kandungan yang sepadan boleh diabaikan.
m dianggap sebagai berbilang baris
Apabila dipadankan dengan ungkapan biasa, rentetan sasaran yang akan dipadankan biasanya dianggap sebagai satu baris.
Metacharacter "start of line" (^) hanya sepadan dengan permulaan rentetan dan metacharacter "end of line" ($) hanya padan dengan hujung rentetan.
Apabila pengubah suai ini ditetapkan, "permulaan baris" dan "penghujung baris" bukan sahaja sepadan dengan permulaan dan penghujung keseluruhan rentetan, tetapi juga sepadan selepas dan sebelum aksara baris baharu di dalamnya.
Nota: Jika tiada aksara "n" dalam rentetan yang hendak dipadankan atau tiada ^ atau $ dalam corak, tetapan pengubah suai ini tidak mempunyai kesan.
Mari sahkan ciri ini melalui percubaan dan kod:
Untuk perlawanan pertama, anda akan mendapati bahawa perlawanan itu tidak berjaya:
<?php $pattern = '/^a\d+/'; $string = "我的未来在自己手中我需要不断的努力 a9是一个不错的字符表示 怎么办呢,其实需要不断奋进"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Untuk perlawanan kedua, Mari cuba tambah m:
<?php $pattern = '/^a\d+/m'; $string = "我的未来在自己手中我需要不断的努力 a9是一个不错的字符表示 怎么办呢,其实需要不断奋进"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Keputusan:
Oh ya! Perlawanan itu berjaya. /^ad+/ Kandungan yang dipadankan ialah a9, yang mesti berada di permulaan baris. Baris kedua juga berjaya dipadankan.
s dikenali sebagai garis
Jika pengubah suai ini ditetapkan, metakarakter titik (.) dalam corak sepadan dengan semua aksara , termasuk baris baharu.
Kali pertama, tiada aksara padanan corak s ditambahkan:
<?php $pattern = '/新的未来.+\d+/'; $string = '新的未来 987654321'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Kali kedua, aksara padanan corak s ditambah selepas ungkapan biasa:
<?php $pattern = '/新的未来.+\d+/s'; $string = "新的未来 987654321"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Hasilnya adalah seperti berikut, Perlawanan berjaya!
Kesimpulan:
1. Kerana pada masa hadapan yang baru, terdapat pemecahan baris selepas masa hadapan
2. Dan (titik ) ialah Padanan semua aksara kecuali aksara bukan ruang putih. Oleh itu, kali pertama tidak berjaya
3. Kali kedua, padanan corak s telah ditambah. Kerana, selepas menambah . (titik), ia boleh memadankan semua aksara.
x Abaikan aksara ruang putih
1. Jika pengubah suai ini ditetapkan, semua aksara ruang kosong dalam corak akan kecuali aksara yang terlepas atau dalam kelas aksara.
2. Watak antara # watak di luar kelas watak yang tidak dilepaskan dan watak baris baharu seterusnya juga diabaikan.
Mari kita percubaan pertama dengan ciri seperti mengabaikan baris kosong:
<?php $pattern = '/a b c /x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Ini juga boleh dipadankan dengan jayanya.
Terdapat ruang dalam $pattern, dan terdapat ruang selepas setiap abc. Tiada ruang dalam $string.
Jadi x mengabaikan aksara ruang putih.
Ayat kedua lebih sukar untuk difahami secara literal,
<?php //重点观察这一行 $pattern = '/a b c #我来写一个注释 /x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
Hasilnya juga perlawanan yang berjaya!
Kami mendapati bahawa ciri kedua bagi x ialah ia diabaikan: aksara antara watak # dan watak baris baharu seterusnya juga diabaikan.
e Cari item yang sepadan dan gantikannya
e corak juga dipanggil rujukan terbalik. Fungsi utama adalah untuk mengeluarkan kandungan dalam kurungan ungkapan biasa dan memasukkannya ke dalam item gantian untuk menggantikan rentetan asal.
Preg_replace() mesti digunakan sebelum menggunakan padanan corak ini.
campuran preg_replace (campuran $perlawanan biasa, campuran $gantian, campuran $carian rentetan)
Fungsi preg_replace: gunakan $item padanan biasa untuk mencari pembolehubah rentetan $cari. Kemudian gunakan pembolehubah $replacement untuk menggantikannya.
Sebelum penjelasan rasmi, mari kita semak semula pengetahuan sebelumnya Kami sengaja meletakkan tanda kurung di sekeliling setiap atom untuk dipadankan:
<?php //加上了括号 $pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
Mari kita lihat Keputusan:
Ini apabila kita bercakap tentang kurungan sebelum ini: terdapat kurungan di luar kandungan yang dipadankan. Kandungan dalam kurungan juga akan diletakkan ke dalam elemen tatasusunan. Seperti yang ditunjukkan dalam gambar: 987, abc, 321.
Mari kita lihat corak e dalam ungkapan ungkapan biasa:
<?php $string = "{April 15, 2003}"; //'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次 $pattern = "/{(\w+) (\d+), (\d+)}/i"; $replacement = "$2"; //字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本 echo preg_replace($pattern, $replacement, $string); ?>
Mari kita lihat hasil pelaksanaan:
Kesimpulan:
Dalam contoh di atas, $2 mata kepada yang pertama (d+) yang diwakili oleh ungkapan biasa. Ia bersamaan dengan mengeluarkan 15 lagi
Apabila menggantikannya, saya menulis $2. Item padanan dikeluarkan dan digunakan untuk menggantikan hasil padanan semula.
Kawalan mod U Greedy
Ekspresi biasa adalah tamak secara lalai, iaitu memadankan sebanyak mungkin.
Mari kita lihat betapa tamaknya ungkapan biasa itu:
<?php $pattern = '/<div>.*<\/div>/'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
Mari kita lihat hasilnya dan dapatkan kesimpulan berikut. Ia sepadan secara langsung daripada "
Hello" kepada "Saya
". Padanan maksimum telah dibuat.
Mari tambah huruf besar U pada sekeping kod yang sama dan lihat kesannya:
<?php $pattern = '/<div>.*<\/div>/U'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
Kami mendapati hanya perlawanan yang keluar:
rreeeseperti ini, membatalkan ciri-ciri tamak ketetapan. Biarkan ia mencari padanan terdekat dan ia OK.
A padanan
bermula dari permulaan rentetan sasaran Corak ini serupa dengan kesan ^ (circumflex) dalam aksara meta.
<div>你好</div>
Kesimpulan:
1. Jika $string tidak boleh dipadankan semasa menambah pengubah mod A, ia boleh dipadankan tanpa menambahkannya
2. Jika A ditambah Apabila menggunakan pengubah suai corak, $string1 boleh dipadankan, kerana ia mesti mula memadankan dari awal
D tiada pemulangan pengangkutan
selepas tamat daripada simbol $Jika pengubah suai ini ditetapkan, metakarakter dolar dalam corak hanya sepadan dengan hujung rentetan sasaran. Tanpa pilihan ini, tanda dolar juga akan sepadan sebelum aksara terakhir jika ia adalah aksara baris baharu.
<?php $pattern = '/this/A'; $string = 'hello this is a '; //$string1 = 'this is a '; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
Kesimpulan:
1. Contohnya, apabila corak sepadan dengan $string, terdapat pemulangan gerabak selepas rentetan $string ini. Ia juga boleh memadankan dengan jayanya tanpa menambah aksara padanan D
2. Contohnya, apabila corak sepadan dengan $string, D ditambah. Terdapat ruang selepas rentetan ini dalam $string, dan perlawanan itu tidak berjaya.