How to check if a string starts with a specified string?
我正在检查字符串是否以http开头。这张支票怎么办?
1 2
| $string1 = 'google.com';
$string2 = 'http://www.google.com'; |
- 您可能想尝试这个独立的库,它可以在没有任何框架的情况下使用。它包括区分大小写和不区分大小写版本的startsWith和endsWith。
- 因为它是一个广泛使用的框架,所以值得一提的是,如果您使用的是laravel,那么您可以使用starts_with和ends_with助手函数。
Use the substr function to return a part of a string.
1
| substr( $string_n, 0, 4 ) ==="http" |
如果你想确定这不是另一个协议。我会使用http://,因为https也会匹配,以及其他东西,比如http-protocol.com。
1
| substr( $string_n, 0, 7 ) ==="http://" |
一般情况下:
- 如果你的针是一个变量,就不需要像下面所说的那样硬编码字符串长度。只需使用SUBSTR($string,0,strlen($query))==$query。
- 使用多字节UTF8字符串时要小心!你的朋友
- 使用substr($string, 0, strlen($query)) === $query时,不需要使用mb_*函数。
- awgy的strpos解决方案使用的资源更少。
- strpos版本更好,因为您不需要存储正在检查的字符串或复制访问它的代码。
使用strpos():
1 2 3
| if (strpos($string2, 'http') === 0) {
// It starts with 'http'
} |
记住这三个等号(===)。如果你只用两个,它就不能正常工作。这是因为如果在干草堆中找不到针,strpos()将返回false。
- 如果您只需要查看一个特定的位置,就不必搜索整个字符串(如果找到针或到达末端,则strpos停止)。
- 这对于短字符串来说是微不足道的,但我将对您的substr()建议进行上表决。
- 请使用SUBSTR,因为strpos搜索整个草堆中的针,而SUBSTR只检查开始(对于长字符串来说,这是最快的)
- 正如甘博所说,SUBSTR没有性能优势。使用strpos(),因为它不要求您将字符串长度硬编码为参数,从而减少了错误。
- @双重营销不,有一个性能优势,以江户一〔1〕这是秋葵的观点。当然,如果在绳子的开头找到针,strpos会很早返回,但如果没有找到,它将不必要搜索整个绳子。这里有一个折衷办法:strpos减少了错误造成打字错误的可能性,但是substr理论上应该表现得更好,我想如果你的草垛是一根巨大的绳子,比如小说的文本,那可能是有问题的。我总是使用strpos,因为你给出的理由,但我对两个答案都投了反对票;substr可能有它的位置。
- 我很抱歉恢复了旧的思路,只是想说这是迄今为止我认为最干净和最优雅的解决方案。
- 这只是一个小小的诡辩,但是向后比较的风格是反直觉的。我建议编辑答案以使用常规的比较顺序。(过去有些程序员在一段时间内这样做是有一个微不足道的原因的,但这是不必要的。)它更具可读性和直观性,就像"if(strpos($string2,'http')==0…"。
- substr()生成垃圾,而strpos()不生成垃圾。除非字符串很长,否则strpos()的整数返回会比substr()生成的垃圾更高。
- @ orrd Hmmm.。是的,一种尤达病;不必要,是的。hrrrm,用它,你不应该。
- 目前最佳解决方案
还有适合这种情况的strncmp()函数和strncasecmp()函数:
1
| if (strncmp($string_n,"http", 4) === 0) |
一般来说:
与substr()方法相比,优势在于strncmp()只做需要做的事情,而不创建临时字符串。
- strncmp()很好,因为它不像substr()那样生成垃圾。它也比strpos()好,因为它不需要扫描整个字符串。这样做不太方便,因为您必须实际硬编码或计算前缀的长度,如果这个错误/稍后更改,函数可能会停止工作。
- 哇,这个简单的问题有很多答案。我选择了你的最好:只需返回strncmp($url,'http',4)==0。手册中有很多字符串函数可供选择,但这显然是适合问题的,我敢打赌这是最好的。
您可以使用简单的regex(用户viriathus的更新版本,因为eregi已被弃用)
1 2 3
| if (preg_match('#^http#', $url) === 1) {
// Starts with http (case sensitive).
} |
或者如果你想要不区分大小写的搜索
1 2 3
| if (preg_match('#^http#i', $url) === 1) {
// Starts with http (case insensitive).
} |
正则表达式允许执行更复杂的任务
1 2 3
| if (preg_match('#^https?://#i', $url) === 1) {
// Starts with http:// or https:// (case insensitive).
} |
从性能上讲,如果字符串不是以您想要的开头,您不需要创建新的字符串(与SUBSTR不同),也不需要解析整个字符串。尽管第一次使用regex(您需要创建/编译它)时会有性能损失。
This extension maintains a global per-thread cache of compiled regular
expressions (up to 4096).
http://www.php.net/manual/en/intro.pcre.php
- 从我的末尾加上1。
- regex比strpos或substr操作复杂得多,因此它需要更高的性能,在这个任务中,显然不需要它。
- @也许吧,但我不考虑性能成本,除非我发现它让系统太慢了。避免过早的优化。另外,regex的功能更强大,开发人员应该知道这一点。
- 我没有说过我不了解regex;)我只是尽量避免使用它:)
- 我认为讨论"绩效导向"是不公平的,因为这是最不可行的方法。
- 在这种情况下,regex的主要问题可能是它非常容易出错(需要适当地转义字符f.i)。
- 这显然是更好的处理方法:范围是查看字符串是否以"http"开头。这与无法处理某些特定情况的parse_url函数有关。regex是创建自己函数的正确方法
- 不要用regex做任何事情。
您可以使用下面的小函数检查字符串是否以HTTP或HTTPS开头。
1 2 3 4 5 6 7
| 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://'; |
- 如果有人读到答案,那么三元? true : false是多余的,可以完全删除。
还工作:
1 2 3
| if (eregi("^http:", $url)) {
echo"OK";
} |
- 2013注意:此函数自php 5.3.0起已被弃用。不鼓励依赖此功能。有关详细信息,请参见php.net eregi函数