正则表达式:安全、快速地删除非字母 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的主要内容,如果未能解决你的问题,请参考以下文章