删除PHP中不带正则表达式的多个空格

删除PHP中不带正则表达式的多个空格,php,regex,Php,Regex,将多个空格转换为一个空格的常见解决方案是使用如下正则表达式: preg_replace('/\s+/',' ',$str); 但是,正则表达式往往速度较慢,因为它必须加载正则表达式引擎。有没有非正则表达式方法可以做到这一点?您可以使用php提供的方法。更新 function replaceWhitespace($str) { $result = $str; foreach (array( " ", " \t", " \r", " \n", "\t\t", "

将多个空格转换为一个空格的常见解决方案是使用如下正则表达式:

preg_replace('/\s+/',' ',$str);

但是,正则表达式往往速度较慢,因为它必须加载正则表达式引擎。有没有非正则表达式方法可以做到这一点?

您可以使用php提供的方法。

更新

function replaceWhitespace($str) {
  $result = $str;

  foreach (array(
      "  ", " \t",  " \r",  " \n",
    "\t\t", "\t ", "\t\r", "\t\n",
    "\r\r", "\r ", "\r\t", "\r\n",
    "\n\n", "\n ", "\n\t", "\n\r",
  ) as $replacement) {
    $result = str_replace($replacement, $replacement[0], $result);
  }

  return $str !== $result ? replaceWhitespace($result) : $result;
}
与之相比:

preg_replace('/(\s)\s+/', '$1', $str);
手工制作的函数在非常长(300kb+)的字符串上运行速度大约快15%

(至少在我的机器上)

试试看

while(false !== strpos($string, '  ')) {
    $string = str_replace('  ', ' ', $string);
}

正则表达式没有那么慢。。。。我怀疑你能找到一个更快的方法,特别是如果空格不同(空格、换行符、制表符等)。除了正则表达式之外的任何东西都是一个黑客,因此可能会更慢。使用该语言附带的工具可能是最好的主意。你说正则表达式的速度很慢。您是否对其进行了基准测试?除非你处理的是大量数据,否则你可能不会注意到。你可以在找到第一个字符后迭代所有字符并删除所有空格,如果它们是连续的,但我认为这种方法比正则表达式慢…@TecBrat数据集越大,这不意味着它的速度就越快,问题的主要关注点是加载正则表达式引擎的时间?我意识到这是一种假设。但是这里的问题似乎是大量的小请求,每个请求都可能需要为一个小数据集加载额外的代码吗?@Chris,我想我误解了这一点。我认为你的观点类似于照片复印机的第一次复印速度与每分钟页数之比。不过,我的观点仍然站得住脚,基准测试仍然是一个好主意,可以知道是否需要一种变通方法。如果正则表达式已经编写好了,那么不妨尝试一下。有没有人有时间测试一下以进行性能比较?假设纯粹是空格,而不担心其他空格。有趣的是,如果我读得对的话,正则表达式占用的时间要长6倍。对于Regex引擎加载时间的关注并不是一个问题,因为preg_替换总体上似乎较慢。(同样是在专门针对空格的情况下)@Chris不太清楚,preg_replace已经处理了不同类型的空格。如果您将模式替换为
/+/
,它的运行速度与str_replace构造一样快。@Yoshi您的代码是一个很好的测试,但是如果您更改示例,比率时间将更改:@Bill或任何其他类型的空白。