php - Dua ungkapan biasa mempunyai kesan yang berbeza
ringa_lee
ringa_lee 2017-05-16 13:08:16
0
3
537

Padan dengan rentetan "abc 123". Minta keluarkan abc dan 123.

<?php
    $str = "abc 123";
    $preg = "/^(.*?)\s+(.*?)$/";
    $preg1 = "/^(.*?)\s*(.*?)$/";
    preg_match($preg, $str, $tmp);
    preg_match($preg1, $str, $tmp1);
    
    echo '<pra>';
    print_r($tmp);
    print_r($tmp1);
    echo '</pre>';
    
    // $tmp
    Susunan
    (
        [0] => abc 123
        [1] =>
        [2] =>
    )
    
    // $tmp1
    Susunan
    (
        [0] => abc 123
        [1] =>
        [2] => abc 123
    )

Mengapa hasil padanan berbeza?

ringa_lee
ringa_lee

ringa_lee

membalas semua(3)
伊谢尔伦

Tiada dua pelajar pertama menjawab langsung.
Biar saya jawab,

Rahsia sebenar terletak pada peraturan padanan malas (atau tidak tamak):

惰性(或叫非贪婪)匹配的规则:

星号或加号后跟个问号,就表示惰性匹配,意思是尽可能少的匹配。

  1. /(.*?)s+/,加号表示前面的匹配(也就是空格s) 出现1次或多次。 这段的意思是尽可能少的匹配,后面至少有一个空格s。 这么看,前面这个括号它能匹配到 abc。

  2. /(.*?)s*/Asterisk atau tanda tambah diikuti dengan tanda soal menunjukkan pemadanan malas, yang bermaksud padanan sesedikit mungkin.

    1. /(.*?)s+/, tanda tambah menunjukkan bahawa padanan sebelumnya (iaitu ruang s) muncul sekali atau lebih. Perenggan ini bermaksud padanan sesedikit mungkin, diikuti dengan sekurang-kurangnya satu ruang s. Melihatnya dengan cara ini, kurungan sebelumnya boleh sepadan dengan abc.
    🎜
  3. 🎜/(.*?)s*/, asterisk menunjukkan bahawa padanan sebelumnya (iaitu ruang s) muncul 0 atau lebih kali. Maksud perenggan ini adalah untuk memadankan sesedikit mungkin, dan tidak boleh ada apa-apa selepasnya (s*). Ini menghasilkan rentetan kosong, tidak sepadan. 🎜🎜 🎜
阿神

Sila ambil perhatian bahawa keputusan kad bebas biasa s+ dan s* pasti berbeza.
"*" Padan dengan subungkapan sebelumnya sifar atau lebih kali. Contohnya, zo"*" 匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。
"+" sepadan dengan "z" dan "zoo".

bersamaan dengan {0,}.

"+" Memadankan subungkapan sebelumnya satu kali atau lebih. Contohnya, "zo+" sepadan dengan "zo" dan "zoo", tetapi bukan "z". + adalah bersamaan dengan {1,}. /^(.

?)s+(.

?)$/

"/" di hadapan dan "/" di belakang menunjukkan bahawa permulaan dan akhir tidak mempunyai makna praktikal.
"^" pertama bermaksud memadankan permulaan teks
() ialah keutamaan dari kiri ke kanan "." bermaksud memadankan mana-mana aksara, "*" bermaksud memadankan lebih daripada 0 kali

Kurungan pertama bermaksud memadankan semua aksara, " ?" padanan tidak tamak, yang bermaksud sepadan dengan aksara sebelumnya atau subungkapan sifar atau sekali.

s ialah sebarang aksara ruang putih

🎜Cadangkan tutorial untuk anda pelajari: pengenalan 30 minit kepada ungkapan biasa🎜
PHPzhong

Betulkan jawapan, ia disebabkan oleh pemadanan yang malas, yang juga merupakan salah satu kesukaran ekspresi biasa.

Apa yang dipanggil padanan malas boleh difahami dengan cara yang popular: jika anda tidak memberitahunya bahawa ada sesuatu di hadapannya, ia tidak akan pergi. Dalam peraturan biasa pertama, anda memberitahunya untuk pergi ke hadapan dan berhenti apabila ia menemui sekurang-kurangnya satu ruang untuk mengiranya sebagai padanan.
Peraturan biasa kedua, anda menyuruhnya untuk bergerak ke hadapan atau ia boleh dikira sebagai padanan jika ia sangat malas dan hanya berhenti bergerak.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan