2011-11-12 65 views
11

我試圖移除除PHP中有效字母(來自任何語言)之外的所有內容。我一直在使用這個:正則表達式:移除非字母UTF-8安全,快速

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

但它是痛苦的緩慢。全程約30倍長於:

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

我處理大量的數據,所以它真的不是使用慢方法是可行的。

有沒有更快的方法來做到這一點?

+0

PHP中唯一的替代方法是'mb_ereg_replace',但速度更慢。 ('iconv'擴展名不提供字母過濾功能,也不知道其他任何內容。) – mario

+2

您嘗試添加'+',例如:/ [^ \ pL \ p {Zs}] +/u' ?它應該表現得更好一些。 – NullUserException

回答

4

嗯,這只是一個奇蹟,它只是慢了30倍,因爲在檢查某個代碼點是否是字母時,它需要考慮的字符數比考慮a-z多1000倍。

這就是說,你可以提高你的正則表達式位:

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

應該由相鄰的非字母/空格分隔組合成一個單一的替換操作加快速度。

2

您可以嘗試使用新的PCRE 8.20版本和--enable-jit選項。這將JIT編譯正則表達式,並可能會提高你的性能。