搜尋

首頁  >  問答  >  主體

php - 兩個正規表示式的效果不一樣

匹配字串"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
    )

為什麼結果匹配不一樣,需要注意什麼。

ringa_leeringa_lee2820 天前548

全部回覆(3)我來回復

  • 伊谢尔伦

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

    前兩位同學都沒有回答到點兒上。
    我來解答一下吧,

    真正的秘密在於惰性(或叫非贪婪)匹配的規則:

    星號或加號後面跟著個問號,就表示惰性匹配,意思是盡可能少的匹配。

    1. /(.*?)s+/,加號表示前面的匹配(也就是空格s) 出現1次或多次。 這段的意思是盡可能少的匹配,後面至少有一個空格s。 這麼看,前面這個括號它可以配對到 abc。

    2. /(.*?)s*/,星號表示前面的匹配 (也就是空格s) 出現0次或多次。 這段的意思是盡量少匹配,後面可以啥都沒有(s*)。 這樣就得到了一個空字串,啥都沒符合。

    回覆
    0
  • 阿神

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

    注意看正規通配符s+ 和 s* 結果一定不一樣啊。
    "*" 符合前面的子表達式零次或多次。例如,zo"*" 匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。
    "+"能匹配“z"以及"zoo"。

    等價於{0,}。

    "+" 符合前面的子表達式一次或多次。例如,「zo+"能匹配"zo"以及"zoo",但不能匹配"z"。 +等價於{1,}。 /^(.

    ?)s+(.

    ?)$/

    前面的"/"和後面的"/"表示開始和結束沒實際意義。
    第一個"^"表示匹配文本的開頭
    ()是優先級從左到右"."表示匹配任意字符,"*"表示匹配0次以上

    第一個括號裡就是匹配所有字符," ?"非貪婪匹配,表示零次或一次匹配前面的字元或子表達式。

    s是任何空白字元

    🎜推薦個教學給你學一下:正規表示式30分鐘入門🎜

    回覆
    0
  • PHPz

    PHPz2017-05-16 13:10:16

    更正下答案,惰性匹配所致,這也是正規困難之一。

    所謂惰性匹配你可以通俗的理解為: 你不告訴它前面有東西,它就不走。 第一個正規裡面,你告訴它往前走遇到至少一個空格就可以停下來算匹配到了。
    第二個正則,你告訴它往前走,可以不用碰到空格也可以碰到空格算匹配,它很懶,乾脆不動了,什麼都不匹配。

    回覆
    0
  • 取消回覆