正则表达式:安全、快速地删除非字母 UTF-8

Posted

技术标签:

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

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

$content=preg_replace('/[^\pL\pZs]/u', '', $content);

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

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

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

有更快的方法吗?

【问题讨论】:

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

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

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

$content=preg_replace('/[^\pL\pZs]+/u', '', $content);

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于正则表达式:安全、快速地删除非字母 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

快速读懂正则表达式

正则表达式快速入门

正则表达式 - 对 URL 友好的任何文本

快速掌握正则表达式 | 04 元字符真好玩

快速掌握正则表达式 | 04 元字符真好玩

快速掌握正则表达式 | 04 元字符真好玩