匹配字符串"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分钟入门🎜更正下答案,惰性匹配所致,这也是正则难点之一。