2012-01-31 76 views
2

我用正則表達式的最後一天,試驗和下面的代碼給了我一個非常意外的結果PHP的正則表達式:需要一些解釋

<?php 
// get host name from URL 
if (preg_match("/^(http:\/\/)?([^\/]+)/i", "http://", $matches)) { 
    $host = $matches[1]; 
    echo $host."<br/>"; 
} 
else 
    echo "Not Found"; 
?> 

結果是一個空行。任何人都可以解釋爲什麼是這樣嗎?我期待它打印'http://',因爲它是第一次匹配,正如我所料,匹配[0]打印'http://',爲什麼首先打印空字符?

回答

5
/^(http:\/\/)?([^\/]+)/i 

http://是可選的,'not /「不是。

因此,當它來配合它,它會看到,如果它率先應用可選的規則不能匹配,但如果適用的一個或多個不/規則可以與之匹敵。

換句話說,它是匹配的http:而不是http://因爲HTTP:不是/。

array(3) { 
    [0]=> 
    string(5) "http:" 
    [1]=> 
    string(0) "" 
    [2]=> 
    string(5) "http:" 
}