cari

Rumah  >  Soal Jawab  >  teks badan

php - Dua ungkapan biasa mempunyai kesan yang berbeza

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_leeringa_lee2810 hari yang lalu539

membalas semua(3)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:10:16

    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. 🎜🎜 🎜

      balas
      0
  • 阿神

    阿神2017-05-16 13:10:16

    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🎜

    balas
    0
  • PHPz

    PHPz2017-05-16 13:10:16

    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.

    balas
    0
  • Batalbalas