2012-03-30 11 views
6

Me quedé atrapado en esto y no puedo encontrar una solución. Me gustaría tratar de transformar una cadena en minúsculas usando preg_replace. Simplemente no puedo crear la expresión regular correcta. La razón es que strtolower normal no admite caracteres Unicode. Sé que podría usar mb_strtolower pero esta función parece ser bastante lenta y, a su lado, no todos tienen soporte para MB.Cómo transformar una cadena a minúscula con preg_replace

¿Alguna pista?

Saludos, Radek

EDIT: Ok, Muchas gracias por su ayuda chicos. Creo que mi enfoque no fue del todo correcto. Creo que sería mucho mejor usar esto: How do I detect non-ASCII characters in a string? y luego usar respectivamente strtolower o mb_strtolower si está disponible.

+8

estoy curiosidades, lo que hace ¿Crees que la expresión regular realmente sería más rápida que mb_strtolower? –

+0

puede usar la función strtolower() php para convertir el aguijón en minúsculas. –

+0

@andreas No estoy seguro. Básicamente quería probarlo primero. –

Respuesta

5

Regex no puede cambiar los caracteres por sí mismo, solo puede cambiar su orden y/o agregar caracteres adicionales/eliminar algunos de ellos.

Hay preg_replace_callback o /e marca, pero solo pueden manipular con funciones conocidas y, por lo tanto, no pueden hacer mejor que strtolower.

Si no puede confiar en la existencia de la función mb_strolower, tendrá que implementarla usted mismo.

+0

¿Entonces básicamente no es posible? –

+0

Sí, básicamente no es posible. Regex es una herramienta para la coincidencia de patrones y la recomposición de cadenas, no puede transformar caracteres por sí mismo. – Nameless

0

No debe usar un preg_replace para esto porque preg_replace se usa para hacer coincidir un cierto patrón y reemplazarlo por otra cosa. El Wat que desea es reemplazar cada uno de los caracteres en mayúscula con uno minúsculo, por lo que no es necesario que coincida con un patrón.

mb_strtolower sería el camino a seguir, y si usted no tiene las funciones mb_nogueira @ yahoo.com que tendrá que escribir una función por sí mismo utilizando una gran cantidad de str_replace de ...

+0

Sí, pero mb_stratolower es tan lento. Hice algunas pruebas para comparar mb_strlower y strtolower nativo y MB parece ser unas 30 veces más lento que el nativo. Mi mayor problema es que en el momento en que tengo que hacer la strtolower no sé si tengo caracteres Unicode dentro de la cadena o no. –

+0

Tal vez use primero strtolower, luego use preg_replace_callback para reemplazar todos los caracteres que no sean minúsculas por defecto (/ [^ az] + /) y luego use mb_strtolower para ese – rednaw

+1

Vine aquí porque estaba buscando una forma de "decaptizar" un cadena (por ejemplo, "" The War of NextGen' "a" 'the war of nextGen'" - por lo que para este caso, la cadena inferior NO funcionará para mí. Estaba intentando usar preg_replace con '"/\ b (\ w)/"' y la cadena de reemplazo como 'strtolower (" $ 1 ")' - ¡pero no funciona! ¿Seguramente debería haber una manera? –

Cuestiones relacionadas