如何检查字符串是否以指定的字符串开头?

And*_*rew 448 php

我正在尝试检查一个字符串是否以http.我怎么做这个检查?

$string1 = 'google.com';
$string2 = 'http://www.google.com';
Run Code Online (Sandbox Code Playgroud)

Ken*_*ins 768

substr( $string_n, 0, 4 ) === "http"
Run Code Online (Sandbox Code Playgroud)

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

substr( $string_n, 0, 7 ) === "http://"
Run Code Online (Sandbox Code Playgroud)

总的来说:

substr($string, 0, strlen($query)) === $query
Run Code Online (Sandbox Code Playgroud)

  • 如果您的针是变量,则无需像下面所述硬编码字符串长度.只需使用substr($ string,0,strlen($ query))=== $ query. (82认同)
  • 使用多字节utf8字符串时要小心!mb_substr是你的朋友 (15认同)
  • 使用 `substr($string, 0, strlen($query)) === $query` 时不需要使用 `mb_*` 函数 (3认同)
  • 根据 [str_starts_with RFC](https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions),在 PHP 8 之前检查字符串是否以另一个字符串开头的最有效的 CPU 和内存方法是 `strncmp($haystack, $needle, strlen($needle)) === 0`。 (3认同)
  • @JesseSteele 它的位置,长度而不是开始位置,结束位置 (2认同)

awg*_*wgy 597

用途strpos():

if (strpos($string2, 'http') === 0) {
   // It starts with 'http'
}
Run Code Online (Sandbox Code Playgroud)

记住三个等号(===).如果你只使用两个,它将无法正常工作.这是因为如果在大海捞针中找不到针头strpos()会返回false.

  • 如果您只需要查看特定位置,则无需搜索整个字符串(如果找到针或者到达末端,则"strpos"停止). (28认同)
  • @doublemarked不,有*是*substr`的​​性能优势,这是Gumbo的观点.当然,如果在字符串的开头找到针,`strpos`将提前返回,但如果找不到*,它将不必要地搜索整个字符串.这里有一个权衡; `strpos`减少了导致错误的错误的机会,但理论上`substr`应该表现得更好,我想如果你的干草堆是一些巨大的字符串,就像小说的文字一样,这可能是可以想象的.因为你给出的原因,我总是使用`strpos`,但我已经提出了两个答案; `substr`可能有它的位置. (15认同)
  • 这是一个轻微的狡辩,但向后比较风格是反直觉的.我建议编辑答案以使用常规比较顺序.(曾经有一些程序员在一段时间内做到这一点很简单,但这并不是必需的.)它更具可读性和直观性,因为"if(strpos($ string2,'http')=== 0)... (12认同)
  • 请使用substr代替,因为strpos会搜索整个干草堆中的针,而substr只会检查开头(对于长字符串来说最快) (7认同)
  • @orrd嗯... yeeeees,yoda条件; 不必要的,是的.hrrrrm,使用它,你不应该. (3认同)
  • 我很抱歉复活旧线程,只是想说这是迄今为止我认为最干净,最优雅的解决方案. (2认同)
  • substr()生成垃圾,而strpos()则不生成垃圾.除非你的字符串非常长,否则strpos()的整数返回会击败生成的substr()垃圾以获得性能. (2认同)

Sid*_*Sid 83

还有strncmp()功能和strncasecmp()功能,非常适合这种情况:

if (strncmp($string_n, "http", 4) === 0)
Run Code Online (Sandbox Code Playgroud)

一般来说:

if (strncmp($string_n, $prefix, strlen($prefix)) === 0)
Run Code Online (Sandbox Code Playgroud)

substr()方法的优点是strncmp()只需执行需要完成的操作,而无需创建临时字符串.

  • strncmp()很好,因为它不像substr()那样生成垃圾.它也比strpos()更好,因为它不需要扫描整个字符串.你不得不实际硬编码或计算前缀的长度是不太方便的,如果你错了/稍后更改它,该功能可能会停止工作. (5认同)
  • 哇,这个简单的问题有很多答案.我选择你的是最好的:只需返回strncmp($ url,'http',4)=== 0.在手册中可以选择很多字符串函数,但这显然适合这个问题而且我' d冒险猜测它是最好的表现. (4认同)

use*_*648 42

您可以使用一个简单的regex(更新版本从用户viriathuseregi已废弃)

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

或者如果你想要一个不区分大小写的搜索

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

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

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

性能方面,您不需要创建新的字符串(与substr不同),也不需要解析整个字符串,如果它不是以您想要的开头.虽然第一次使用正则表达式(您需要创建/编译它),但性能会受到影响.

此扩展维护已编译正则表达式的全局每线程缓存(最多4096). http://www.php.net/manual/en/intro.pcre.php

  • 正则表达式要复杂得多,然后是strpos或substr操作,因此它需要更高的性能,在这项任务中它绝对不需要 (3认同)
  • @ Sharpy35:也许吧,但我没有想到性能成本,除非我发现它使系统太慢了.避免过早优化.正则表达式也是如此强大,它确实是开发人员应该知道的东西. (2认同)
  • 我没有说我不知道​​正则表达式;)我只是尽可能避免使用它:) (2认同)

Jak*_*ake 5

您可以使用下面的小功能检查字符串是否以http或https开头。

function has_prefix($string, $prefix) {
   return substr($string, 0, strlen($prefix)) == $prefix;
}

$url   = 'http://www.google.com';
echo 'the url ' . (has_prefix($url, 'http://')  ? 'does' : 'does not') . ' start with http://';
echo 'the url ' . (has_prefix($url, 'https://') ? 'does' : 'does not') . ' start with https://';
Run Code Online (Sandbox Code Playgroud)

  • 如果有人读了这个答案,那么三元组?true:false`是多余的,可以完全删除 (2认同)