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?
Tiada dua pelajar pertama menjawab langsung.
Biar saya jawab,
Rahsia sebenar terletak pada peraturanpadanan malas (atau tidak tamak):
惰性(或叫非贪婪)匹配
的规则:星号或加号后跟个问号,就表示惰性匹配,意思是尽可能少的匹配。
/(.*?)s+/
,加号表示前面的匹配(也就是空格s) 出现1次或多次。 这段的意思是尽可能少的匹配,后面至少有一个空格s。 这么看,前面这个括号它能匹配到 abc。/(.*?)s*/
Asterisk atau tanda tambah diikuti dengan tanda soal menunjukkan pemadanan malas, yang bermaksud padanan sesedikit mungkin.Sila ambil perhatian bahawa keputusan kad bebas biasa s+ dan s* pasti berbeza.
"*" Padan dengan subungkapan sebelumnya sifar atau lebih kali. Contohnya, zo
bersamaan dengan {0,}."*"
匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。"+"
sepadan dengan "z" dan "zoo".
?)s+(."+"
Memadankan subungkapan sebelumnya satu kali atau lebih. Contohnya, "zo+" sepadan dengan "zo" dan "zoo", tetapi bukan "z". + adalah bersamaan dengan {1,}. /^(.?)$/
Kurungan pertama bermaksud memadankan semua aksara, " ?" padanan tidak tamak, yang bermaksud sepadan dengan aksara sebelumnya atau subungkapan sifar atau sekali."/" 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
s ialah sebarang aksara ruang putih
🎜Cadangkan tutorial untuk anda pelajari: pengenalan 30 minit kepada ungkapan biasa🎜Betulkan jawapan, ia disebabkan oleh pemadanan yang malas, yang juga merupakan salah satu kesukaran ekspresi biasa.