如何检查一个string是否以指定的string开头?

我试图检查一个string是否以http开头。 我怎样才能做这个检查?

 $string1 = 'google.com'; $string2 = 'http://www.google.com'; 
 substr( $string_n, 0, 4 ) === "http" 

如果你想确保它不是另一个协议。 我会使用http:// ,因为https也会匹配,而其他的东西,如http-protocol.com。

 substr( $string_n, 0, 7 ) === "http://" 

一般来说:

 substr($string, 0, strlen($query)) === $query 

使用strpos()

 if (0 === strpos($string2, 'http')) { // It starts with 'http' } 

记住三个等号( === )。 如果只使用两个,它将无法正常工作。 这是因为如果在干草堆中找不到针, strpos()将返回false

还有strncmp()函数和strncasecmp()函数,对于这种情况是非常完美的:

 if (strncmp($string_n, "http", 4) === 0) 

一般来说:

 if (strncmp($string_n, $prefix, strlen($prefix)) === 0) 

substr()方法相比,优势在于strncmp()只是做了需要做的事情,而不需要创build一个临时的string。

你可以使用一个简单的正则expression式(用户viriathus的更新版本,因为eregi已被弃用)

 if (preg_match('#^http#', $url) === 1) { // Starts with http (case sensitive). } 

或者如果你想不区分大小写的search

 if (preg_match('#^http#i', $url) === 1) { // Starts with http (case insensitive). } 

正则expression式允许执行更复杂的任务

 if (preg_match('#^https?://#i', $url) === 1) { // Starts with http:// or https:// (case insensitive). } 

性能方面,你不需要创build一个新的string(与substr不同),也不需要分析整个string,如果它不是开始你想要的。 你第一次使用正则expression式会损害你的性能(你需要创build/编译它)。

这个扩展维护一个编译正则expression式的全局线程caching(最多4096个)。 http://www.php.net/manual/en/intro.pcre.php

您可以使用preg_match函数检查您的string是以http还是https开头,下面是一个示例。

 $url = 'http://www.google.com'; $http = preg_match('/^http[^s]/i', $url); $https = preg_match('/^https/i', $url); echo 'the url ' . ($http ? 'does' : 'does not') . ' start with http'; echo 'the url ' . ($https ? 'does' : 'does not') . ' start with https'; 

也工作:

 if (eregi("^http:", $url)) { echo "OK"; }