Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在另一个字符串中查找字符串的最快方法是什么?_Php_String_Substring - Fatal编程技术网

Php 在另一个字符串中查找字符串的最快方法是什么?

Php 在另一个字符串中查找字符串的最快方法是什么?,php,string,substring,Php,String,Substring,可能重复: 嗨 你能告诉我哪一个更快吗: 或 或 还有什么事吗 在另一个字符串中查找第一个或任意一个字符串 如果我在不区分大小写的模式下使用或检查事件,这对性能有影响吗 在我的例子中,给定字符串的确切位置(如果有的话),或者它在另一个字符串中出现了多少次(如果有的话)并不重要,唯一重要的问题是它是否存在于另一个字符串中 我已经在不同的文章中找到了一些关于速度差异的评论(例如,有人说strstr()更快,以防strpos后出现!==错误检查),但现在我无法确定哪个是正确的 如果您知道在另一个字符

可能重复:


你能告诉我哪一个更快吗:




还有什么事吗
在另一个字符串中查找第一个或任意一个字符串

如果我在不区分大小写的模式下使用或检查事件,这对性能有影响吗

在我的例子中,给定字符串的确切位置(如果有的话),或者它在另一个字符串中出现了多少次(如果有的话)并不重要,唯一重要的问题是它是否存在于另一个字符串中

我已经在不同的文章中找到了一些关于速度差异的评论(例如,有人说strstr()更快,以防strpos后出现!==错误检查),但现在我无法确定哪个是正确的

如果您知道在另一个字符串中搜索字符串的更好方法,请告诉我

非常感谢您的相关评论

============

例如: 从:

注意:

如果您只想确定 特定的针出现在 干草堆,用得更快,用得更少 内存密集型函数strpos() 相反

我愿意相信他们的话:)

更快的方法是:

if (strpos($haystack, $needle) !== false)
不区分大小写的版本显然要慢一些(我希望至少慢2倍)


strncmp()
/
substr()
如果检查
$haystack
是否以
$needle
开头,以及
$haystack
是否相当长(>数百个字符左右),则可能执行得更好


基准:
  • strpos()与strncmp()的比较
请参阅其他基准@(搜索
strpos


一个实际的例子,这种优化(有点)很重要-:


诡计问题。他们做两件不同的事。一个返回子字符串,另一个返回带有字符串的子字符串的起始位置。真正的答案是,你把苹果和桔子做比较,用你需要的那一个

如果要查找模式B出现的字符串A,那么最快的方法是构建A的后缀树并对其执行B搜索。

根据php手册页,strpos比strstr更快,内存占用更少。

我认为
strpos()
会更快,因为它只返回一个整数(如果找不到匹配项,则返回
false
strstr()
返回一个字符串,该字符串包含第一次匹配后的所有文本


对于不区分大小写的搜索,我认为它们会稍微慢一些,因为它们必须执行额外的检查(“两个字符匹配吗?如果不匹配,字符是字母吗?如果是,它匹配小写版本吗?如果不是,它匹配大写版本吗?”等等)

strpos
似乎处于领先地位,我在
“敏捷的棕色狐狸跳过懒惰的狗”中找到了一些字符串,对其进行了测试。

  • strstr
    使用0.48487210273743秒进行1000000次迭代查找
    'quick'
  • strpos
    使用0.40836095809937秒进行1000000次迭代查找
    'quick'
  • strstr
    使用0.45261287689209秒进行1000000次迭代查找
    'dog'
  • strpos
    使用0.39890813827515秒进行1000000次迭代查找
    'dog'


我认为这是一个微观优化。但我很好奇答案;)这是在不到一个小时前(再次)提出的……执行10000次并测量前后的时间,你就会知道哪一个更快。阿利克斯,你是对的,很抱歉,我没有找到这个。胶囊:这是一个好主意,同时我已经做了一个测试,我很快就会发布。哦,我不认为我因为有点不注意而被否决了:((+1是迄今为止唯一一个不关注u型优化的答案。问题并不棘手:找到另一个字符串中出现字符串的最快方法。@Alix Axel,这仍然是一个诡计问题。如果没有性能分析,就无法回答这个问题,因为必须考虑预期的输入(字符串和匹配位置)。最好是说“使用正确的函数”。@Crayon暴力:我仍然不同意,
strstr()
内部与
substr()
+
strpos()
相同,因此它总是会变慢(并且由于返回字符串而消耗更多内存)。无论如何,OP问题的“正确函数”是
str[I]pos()
。有趣的是,在此期间,我多次尝试我自己的基准测试(我将发布它),我不得不发现它不可计算和/或确定strstr总是较慢。例如,我上一次测试的结果:strstrstr():1.17782998,strpos()!==false:1.191504,这意味着strstr快了0.01367402…嗯。所以这可能要看情况了。最后是一个有来源和证据的真实答案。@Matthieu,我想你是在开玩笑。@Matthieu那里没有“来源和证据”。“证据”这将是一个真正的实时基准测试,具有可重复运行的预期输入和使用。哇,谢谢,我没有注意到这个官方信息,虽然它在我眼前,但我只需要打开它们:D:D@Jason@pst:好吧,我太激动了……也许不被认可,但如果php文档这么说的话……他们知道他们在说什么。你去看看吧副本和答案也一样。你不认为两者是不同的东西吗?@Shakti Singh:不,因为这一个有另一个细节(案件不敏感)。在这种情况下,您必须删除您的评论或回答,否则会给某些人造成混淆persons@Shakti辛格:我不需要做任何事,评论是自动提供的,主要问题是完全相同的-我不认为没有理由不关闭它。正如你所希望的那样,我认为它应该有益于乔布斯,我相信这个板凳已经是@(要是它能起来就好了)!另一个:
if (strpos($haystack, $needle) !== false)
$count = 0;
$hashcash = sprintf('1:20:%u:%s::%u:', date('ymd'), $to, mt_rand());

while (strncmp('00000', sha1($hashcash . $count), 5) !== 0)
{
    ++$count;
}

$header['X-Hashcash'] = $hashcash . $count;