Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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字符串函数和正则表达式哪个更有效?_Php_Regex_String_Performance - Fatal编程技术网

在PHP中,PHP字符串函数和正则表达式哪个更有效?

在PHP中,PHP字符串函数和正则表达式哪个更有效?,php,regex,string,performance,Php,Regex,String,Performance,我正在编写PHP代码来解析字符串。它需要尽可能快,所以正则表达式是应该走的路吗?我有一个预感,PHP字符串函数更昂贵,但这只是一个猜测。真相是什么 下面是我需要对字符串执行的具体操作: 抓取前半部分(基于子字符串“000000”的第三个位置)并将其哈希值与下一个20字节进行比较,丢弃剩余的任何内容 通过下一个“000000”将第9个字节解析为一个数据段。然后抓取之后的19个字节,并将其拆分为8(掷1)和8。然后我做了一些其他的事情,将这两个8字节的字符串转换成日期 这就是我需要做的事情 本机字符

我正在编写PHP代码来解析字符串。它需要尽可能快,所以正则表达式是应该走的路吗?我有一个预感,PHP字符串函数更昂贵,但这只是一个猜测。真相是什么

下面是我需要对字符串执行的具体操作:

抓取前半部分(基于子字符串“000000”的第三个位置)并将其哈希值与下一个20字节进行比较,丢弃剩余的任何内容

通过下一个“000000”将第9个字节解析为一个数据段。然后抓取之后的19个字节,并将其拆分为8(掷1)和8。然后我做了一些其他的事情,将这两个8字节的字符串转换成日期


这就是我需要做的事情

本机字符串函数要快得多。regexp的好处是,您可以用它们做几乎任何事情。

我相信有一个阈值,从这个阈值来看,正则表达式比一堆PHP字符串函数调用要快。不管怎样,这在很大程度上取决于你在做什么。你必须找出平衡点


现在你编辑了你的问题。我会使用字符串函数来完成您要完成的任务。strpos()和substr()是第一眼想到的。我认为如果你想要最高的性能,你应该避免使用正则表达式,因为它有助于最小化工作量,但不会有最好的性能,因为你几乎总是可以使用字符串例程来调整代码以解决特定的问题,并从中获得很大的性能提升。但是对于不能进行太多优化的简单解析例程,您仍然可以使用regex,因为它不会产生太大的影响


编辑:对于您发布的这个特定问题,我更喜欢字符串操作,但这只是因为我不知道如何在正则表达式中执行它。这看起来很简单,除了散列,所以我认为正则表达式/字符串函数不会有太大的区别

这取决于你的情况:如果你想做一些相当基本的事情(例如:搜索一个字符串,用其他东西替换一个子字符串),那么常规的字符串函数就是最好的选择。如果您想做一些更复杂的事情(例如:搜索IP地址),那么Regex函数肯定是一个更好的选择

我还没有分析正则表达式,所以我不能说它们在运行时会更快,但我可以告诉你,花费额外的时间使用基本函数将等价物拼凑在一起是不值得的


使用OP中的新信息进行编辑:

听起来好像您实际上需要在这里执行一些小字符串操作。由于每个步骤都非常基本,我怀疑您是否能够使用正则表达式一次性完成所有这些步骤(甚至是其中的两个步骤),因此我将使用以下基本功能:

$results = array();
$searchWord = 'rings';
foreach ($testArray as $phrase){
  $phraseArr = explode(' ', $phrase);
  if(in_array($searchWord, $phraseArr)){
    $results[] = $phrase;
  }
}
抓取前半部分(基于子字符串“000000”的第三个位置)并将其哈希值与下一个20字节进行比较,丢弃剩余的任何内容

用法:和
或者:
/$(.*0{6}.*0{6}.*?)0{6}/

然后抓取之后的19个字节,并将其拆分为8(掷1)和8

用法:
substr()
-(我假设您这里指的是17个字节--8+1+8)


这取决于你的需要。大多数正则表达式操作的速度比人们想象的要快,甚至可以在某些琐碎的操作中胜过内置字符串函数。请注意,我考虑的是preg库,而不是内置的regex库,它非常慢。

如果您使用字符串函数所做的一切都是合理的,那么您应该使用它们。例如,如果您要确定常量字符串
'abc'
是否出现在
$value
中,您肯定要检查
strpos($value,'abc')!=false
,非
预匹配('/abc/',$value)
。但是,如果您发现自己在进行大量的字符串改组和转换,以实现使用正则表达式所能实现的功能,那么几乎肯定会破坏性能和可维护性


但是,当关注速度时,当它归结到速度时,不要去想它,而是去计时。
time
命令是您的朋友。

一般来说,字符串函数更快,正则表达式函数更灵活


与其他方法一样,您的结果可能会有所不同,唯一可以确定的方法是尝试两种方法并进行基准测试。

我同意大家的看法:字符串函数的性能比正则表达式函数稍高一些。我只是想展示一下我在终端上做的一个小测试作为证明:

strps()

$ time php -r '$i = 0; while($i++ < 1000000) strpos("abc", "a");'

real    0m0.380s
user    0m0.368s
sys    0m0.008s
$ time php -r '$i = 0; while($i++ < 1000000) preg_match("/abc/", "a");'

real    0m0.441s
user    0m0.432s
sys    0m0.004s
$time php-r'$i=0;而($i++<1000000)STRPO(“abc”、“a”);'
实际0.380s
用户0.368s
sys 0m0.008s
预匹配()

$ time php -r '$i = 0; while($i++ < 1000000) strpos("abc", "a");'

real    0m0.380s
user    0m0.368s
sys    0m0.008s
$ time php -r '$i = 0; while($i++ < 1000000) preg_match("/abc/", "a");'

real    0m0.441s
user    0m0.432s
sys    0m0.004s
$time php-r'$i=0;而($i++<1000000)preg_match(“/abc/”,“a”);'
实0.441秒
用户0.432s
系统0m0.004s

我在搜索一些关于regex性能的信息——因为我需要进行大量查找——事实上,这取决于您想要实现什么。出于我的目的,我测试了一种类型的搜索来比较性能

规格: 我需要在字符串数组中找到简单字符串。 为了进行测试,我使用了
$testArray
,它是一个由~11k个多单词短语组成的数组,这些短语是根据关于托尔金的文章构建的(例如字符串“指环王的历史”、“克里斯托弗·托尔金”)。 因为我只想找到包含确切单词的短语,所以无法使用
strpos()
函数作为示例。当搜索“铃声”时,它还会找到包含“铃声”单词的短语

使用php函数的代码:

$results = array();
$searchWord = 'rings';
foreach ($testArray as $phrase){
  $phraseArr = explode(' ', $phrase);
  if(in_array($searchWord, $phraseArr)){
    $results[] = $phrase;
  }
}
使用正则表达式函数的代码:

$results = array();
$pattern= "/( |^)rings( |$)/";
$results = preg_grep($pattern, $testArray);
$results = array();
$searchWord = 'rings';
foreach ($testArray as $phrase){
  if(strpos(' ' . $phrase . ' ', ' ' . $searchWord . ' ')!==FALSE){
    $results[] = $phrase;
  }
} 
我发现在这个例子中,regex函数大约快10倍

100次搜索的执行时间为(使用各种单词)

  • 对于php函数,从0.3436秒到0.3468秒
  • 对于正则表达式,从0.0332秒到0.0406秒
这样的搜索可能很琐碎,但对于更复杂的任务,我认为这将是非常困难/不可能的