匹配字串"abc 123"。要求取出abc和123。
<?php
$str = "abc 123";
$preg = "/^(.*?)\s+(.*?)$/";
$preg1 = "/^(.*?)\s*(.*?)$/";
preg_match($preg, $str, $tmp);
preg_match($preg1, $str, $tmp1);
echo '<pre>';
print_r($tmp);
print_r($tmp1);
echo '</pre>';
// $tmp
Array
(
[0] => abc 123
[1] => abc
[2] => 123
)
// $tmp1
Array
(
[0] => abc 123
[1] =>
[2] => abc 123
)
為什麼結果匹配不一樣,需要注意什麼。
前兩位同學都沒有回答到點兒上。
我來解答一下吧,
真正的秘密在於
惰性(或叫非贪婪)匹配
的規則:星號或加號後面跟著個問號,就表示惰性匹配,意思是盡可能少的匹配。
/(.*?)s+/
,加號表示前面的匹配(也就是空格s) 出現1次或多次。 這段的意思是盡可能少的匹配,後面至少有一個空格s。 這麼看,前面這個括號它可以配對到 abc。/(.*?)s*/
,星號表示前面的匹配 (也就是空格s) 出現0次或多次。 這段的意思是盡量少匹配,後面可以啥都沒有(s*)。 這樣就得到了一個空字串,啥都沒符合。注意看正規通配符s+ 和 s* 結果一定不一樣啊。
等價於{0,}。"*"
符合前面的子表達式零次或多次。例如,zo"*"
匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。"+"
能匹配“z"以及"zoo"。
?)s+(."+"
符合前面的子表達式一次或多次。例如,「zo+"能匹配"zo"以及"zoo",但不能匹配"z"。 +等價於{1,}。 /^(.?)$/
第一個括號裡就是匹配所有字符," ?"非貪婪匹配,表示零次或一次匹配前面的字元或子表達式。前面的"/"和後面的"/"表示開始和結束沒實際意義。
第一個"^"表示匹配文本的開頭
()是優先級從左到右"."表示匹配任意字符,"*"表示匹配0次以上
s是任何空白字元
🎜推薦個教學給你學一下:正規表示式30分鐘入門🎜更正下答案,惰性匹配所致,這也是正規困難之一。