【问题标题】:RegEx: Remove non-letters UTF-8 Safe, Quickly正则表达式:安全、快速地删除非字母 UTF-8
【发布时间】:2011-12-27 13:33:54
【问题描述】:

我正在尝试删除 PHP 中除有效字母(来自任何语言)之外的所有内容。我一直在用这个:

$content=preg_replace('/[^\pL\p{Zs}]/u', '', $content);

但它非常缓慢。花费的时间大约是以下的 30 倍:

$content=preg_replace('/[^a-z\s]/', '', $content);

我正在处理大量数据,因此使用慢速方法确实不可行。

有更快的方法吗?

【问题讨论】:

  • PHP 中唯一的替代方案是mb_ereg_replace,但这更慢。 (iconv 扩展不提供字母过滤,并且不知道其他任何内容。)
  • 您是否尝试过添加+,例如:/[^\pL\p{Zs}]+/u?它的性能应该会好一些。

标签: php regex utf-8


【解决方案1】:

嗯,奇怪的是它只慢了 30 倍,因为在检查某个代码点是否为字母时,它需要考虑比 a-z 多约 1000 倍的字符。

也就是说,您可以稍微改进一下您的正则表达式:

$content=preg_replace('/[^\pL\p{Zs}]+/u', '', $content);

应该通过将相邻的非字母/空格分隔符组合成一个替换操作来加速它。

【讨论】:

    【解决方案2】:

    您可以尝试使用带有--enable-jit 选项的新PCRE 8.20 版本。这将 JIT 编译正则表达式并可能为您提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多