2011-11-12 6 views
11

Estoy tratando de eliminar todo, excepto las letras válidas (de cualquier idioma) en PHP. He estado usando esto:RegEx: eliminar non-letters UTF-8 Safe, Quickly

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

Pero es terriblemente lento. Toma aproximadamente 30 veces más largo que:

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

estoy tratando con grandes cantidades de datos, por lo que realmente no es factible el uso de un método lento.

¿Hay una manera más rápida de hacer esto?

+0

La única alternativa en PHP es 'mb_ereg_replace', pero eso es incluso más lento. (La extensión 'iconv' no proporciona filtrado de letras, y no sabe de nada más). – mario

+2

¿Ha intentado agregar un' + ', por ejemplo:'/[^ \ pL \ p {Zs}] +/u' ? Debería funcionar un poco mejor. – NullUserException

Respuesta

4

Bueno, es una maravilla, es solo 30 veces más lento, teniendo en cuenta que necesita tomar aproximadamente 1000 veces más caracteres que solo a-z en cuenta al verificar si un determinado punto de código es una letra o no.

Dicho esto, se puede mejorar la expresión regular un poco:

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

debería acelerarlo mediante la combinación de los no letras/separadores de espacios adyacentes en una sola operación de sustitución.

2

Puede intentar utilizar la nueva versión de PCRE 8.20 con la opción --enable-jit. JIT compilará la expresión regular y podría mejorar el rendimiento para usted.