Tutorial pembangunan PHP asas: Pengubah suai corak dalam ungkapan biasa

1. Pengenalan Masalah

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:

23.png

Penggunaan aksara padanan corak adalah seperti berikut:

/ Ekspresi biasa ungkapan/corak Simbol padanan pola

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 aksara padanan corak

2 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-duanya. $string dan $string1 berjaya dipadankan. Oleh itu, selepas menambah i pada penghujung, kes kandungan yang sepadan boleh dipisahkan

3. m dianggap sebagai berbilang baris

Apabila pemadanan biasa dilakukan, rentetan sasaran yang akan dipadankan biasanya dianggap sebagai garisan.

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 akan 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:

Seperti yang ditunjukkan di sebelah kanan

Padanan berjaya. /^ad+/ Kandungan yang dipadankan ialah a9, yang mesti berada di permulaan baris. Baris kedua juga berjaya dipadankan.

4. s dianggap sebagai satu baris

Jika pengubah suai ini ditetapkan, metakarakter titik (.) dalam corak sepadan dengan semua aksara , termasuk baris baharu.

Kali pertama, tiada aksara padanan corak s ditambah:

<?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 '没有匹配到';
?>

Keputusan adalah seperti berikut, perlawanan telah berjaya!

Kesimpulan:

1 Kerana pada masa hadapan yang baru, terdapat pemecahan talian selepas masa hadapan

2. Dan .(titik) sepadan dengan semua aksara kecuali aksara bukan ruang putih. Oleh itu, kali pertama tidak berjaya

3 kali kedua, padanan corak s. Kerana, selepas menambah . (titik), ia boleh memadankan semua aksara.

5 x mengabaikan aksara ruang kosong

1. Jika pengubah suai ini ditetapkan, aksara ruang kosong dalam corak akan diabaikan sepenuhnya 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 bereksperimen dahulu 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!

Kesimpulan: Kami mendapati bahawa ciri kedua bagi x ialah ia diabaikan: aksara antara watak # dan watak baris baharu seterusnya juga diabaikan.

6. e Cari item yang sepadan dan gantikannya

  • mod e 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 $biasa padanan, campuran $gantian, campuran $carian rentetan)

  • Fungsi preg_replace: gunakan $ Biasa perubahan padanan dan mencari pembolehubah rentetan $ carian. 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 Hasilnya di sebelah kanan.

Ini semasa 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 seterusnya:

<?php
$string = "{April 15, 2003}";
//'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i";
$replacement = "$2";
//字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string);
?>

Perhatikan hasilnya di sebelah kanan

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.

7. Kawalan mod tamak U

Ekspresi biasa adalah tamak secara lalai, iaitu padanan 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 secara langsung sepadan dengan "

Hello" kepada "Saya

". Padanan maksimum telah dibuat.

Untuk sekeping kod yang sama, mari tambah huruf besar U 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 '没有匹配到';
}
?>

Perhatikan output:

Kami mendapati hanya padanan yang keluar:

<div>Hello</div>

Dengan cara ini, ciri ketamakan keteraturan dibatalkan. Biarkan ia mencari padanan terdekat dan ia OK.

8. A Padanan

bermula dari permulaan rentetan sasaran Corak ini serupa dengan kesan ^ (circumflex) dalam aksara meta .

<?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:

Jika $string tidak dapat dipadankan apabila menambah pengubah mod A, ia boleh dipadankan tanpa menambahkannya

Jika pengubah mod A ditambah, $string1 boleh dipadankan, kerana ia mesti dipadankan dari awal

9 D End$ No carriage kembali dibenarkan selepas

Jika pengubah suai ini ditetapkan, metakarakter dolar dalam corak hanya akan sepadan dengan hujung rentetan sasaran. Tanpa pilihan ini, tanda dolar juga akan sepadan sebelum aksara terakhir jika ia adalah aksara baris baharu.

<?php
$pattern = '/\w+this$/';
 //$pattern1 = '/\w+this$/D';
$string = "hellothis ";
 if (preg_match($pattern, $string, $match))
{ echo '匹配到了,结果为:'; var_dump($match); }
else
{ echo '没有匹配到'; }
?>

Hasilnya ditunjukkan di sebelah kanan

Kesimpulan:

1 Contohnya, apabila corak sepadan dengan $string, terdapat pengembalian selepas rentetan ini kereta $string. 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.

Meneruskan pembelajaran
||
<?php //在后面加上了一个i $pattern = '/ABC/i'; $string = '8988abc12313'; $string1 = '11111ABC2222'; if(preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else{ echo '没有匹配到'; } ?>
  • Cadangan kursus
  • Muat turun perisian kursus