我試圖移除除PHP中有效字母(來自任何語言)之外的所有內容。我一直在使用這個:正則表達式:移除非字母UTF-8安全,快速
$content=preg_replace('/[^\pL\p{Zs}]/u', '', $content);
但它是痛苦的緩慢。全程約30倍長於:
$content=preg_replace('/[^a-z\s]/', '', $content);
我處理大量的數據,所以它真的不是使用慢方法是可行的。
有沒有更快的方法來做到這一點?
我試圖移除除PHP中有效字母(來自任何語言)之外的所有內容。我一直在使用這個:正則表達式:移除非字母UTF-8安全,快速
$content=preg_replace('/[^\pL\p{Zs}]/u', '', $content);
但它是痛苦的緩慢。全程約30倍長於:
$content=preg_replace('/[^a-z\s]/', '', $content);
我處理大量的數據,所以它真的不是使用慢方法是可行的。
有沒有更快的方法來做到這一點?
嗯,這只是一個奇蹟,它只是慢了30倍,因爲在檢查某個代碼點是否是字母時,它需要考慮的字符數比考慮a-z
多1000倍。
這就是說,你可以提高你的正則表達式位:
$content=preg_replace('/[^\pL\p{Zs}]+/u', '', $content);
應該由相鄰的非字母/空格分隔組合成一個單一的替換操作加快速度。
您可以嘗試使用新的PCRE 8.20版本和--enable-jit
選項。這將JIT編譯正則表達式,並可能會提高你的性能。
PHP中唯一的替代方法是'mb_ereg_replace',但速度更慢。 ('iconv'擴展名不提供字母過濾功能,也不知道其他任何內容。) – mario
您嘗試添加'+',例如:/ [^ \ pL \ p {Zs}] +/u' ?它應該表現得更好一些。 – NullUserException