Php regexp:需要一些解释

Err*_*ric 2 php regex

我最后一天在试用regexps,下面的代码给了我一个意想不到的结果

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

结果是一个空白行.任何人都可以解释为什么会这样吗?我期待它打印'http://',因为它是第一个匹配,正如我所料,匹配[0]打印'http://'所以为什么首先打印空字符?

Cor*_*bin 5

/^(http:\/\/)?([^\/]+)/i
Run Code Online (Sandbox Code Playgroud)

http://是可选的,'not /'不是.

因此,当它匹配它时,如果它首先应用可选规则,它将看到它无法匹配它,但如果应用一个或多个not /规则它可以匹配它.

换句话说,它匹配http:而不是http://,因为http:不是/.

array(3) {
  [0]=>
  string(5) "http:"
  [1]=>
  string(0) ""
  [2]=>
  string(5) "http:"
}
Run Code Online (Sandbox Code Playgroud)