Expresiones regulares php

BLZKZ

Este es el hilo que se abre cíclicamente en dev de expresiones regulares xD

Explico mi caso:

Para no tener problemas con las url estoy usando preg_replace para remplazar símbolos por "-" , al estilo mv. De momento de patrón tengo "/\W|¿|¡" pero claro ni mucho menos se si está completo o si puede tener efectos colaterales.

Si conocéis un patrón mejor me lo podéis decir? xD
Hace un par de hora no tenía ni zorra de RE, me he leído un par de howto's y el manual de php.net bastante por encima, así que no me apedreéis mucho :(

guner

Igual te interesa introducir una clase de carácter, para sustituir varias apariciones de caracteres no deseados por un solo "-".

Algo como /[\W¿¡]+/

Además, creo que te interesa sustituir caracteres acentuados (óáïû) por sus homólogos sin acento. Lo digo porque veo que MV lo hace así, pero no conozco un método "prefabricado" en PHP y lo que encuentro por internet es un poco guarrete. http://www.e-capy.com/reemplazar-la-n-acentos-espacios-y-caracteres-especiales-con-php-actualizada/

1 1 respuesta
BLZKZ

tienes razón #2 no lo habia pensado xD gracias

Por cierto no sabrás alguna forma para pasar caracteres con tilde (cualquier clase de tilde) al correspondiente sin tilde sin armar un caos de remplazos XD
#4 gracias, contesté sin actualizar la pagina y no vi el edit :)

1 respuesta
guner

No conozco nada que no sea una chapuza, pero mezclando un poco del link que he puesto y la posibilidad de meter un array de cadenas/array de sustituciones en preg_repace pude quedar un poco mejor.

edit1:

he adaptado esto de una . prueba a mejorarlo

$reemplaza = array (
'/[áàâãª@]/'=> 'a',
'/[ÁÀÂÃ]/' => 'A',
'/[ÍÌÎ]/' => 'I',
'/[íìî]/' => 'i',
'/[éèê]/' => 'e',
'/[ÉÈÊ]/' => 'E',
'/[óòôõº]/' => 'o',
'/[ÓÒÔÕ]/' => 'O',
'/[úùû]/' => 'u',
'/[ÚÙÛ]/' => 'U',
'/ç/' => 'c',
'/Ç/' => 'C',
'/ñ/' => 'n',
'/Ñ/' => 'N',
'/[\W¿¡]+/' => '-',
'/-/' => '', #elimina - al principio
'/-$/' => ''); #elimina - al final

print preg_replace(
array_flip($reemplaza), $reemplaza, '¡Hola chic@s, ¿qué tal?');

#3, he visto un truco aprovechable con htmlentities.
http://forobeta.com/themes/27963-codigos-reemplazar-n-y-tildes.html (respuesta 3). Se podría implementar algo a partir de esto para las letras tildadas.

2 respuestas
BLZKZ

#4 pues si, porque todo lo paso por htmlentities XD

Ya habia puesto el patron practicamente lo que tu has puesto en tu edit aprovechando parte del reply del blog.

Btw gracias :)

1 respuesta
guner

Si vas a utilizar la matriz de reemplazos, hay un problema con los patrones que eliminan los - al principio y al final. como he querido aprovechar la matriz para usarla con las claves cambiadas mediante array_flip en el preg_replace, ecuentra un error porque dos patrones tendrían la misma clave.

Se soluciona facil así.

$reemplaza = array (
'/[áàâãª@]/'=> 'a', 
'/[ÁÀÂÃ]/' 	=> 'A', 
'/[ÍÌÎ]/' 	=> 'I', 
'/[íìî]/' 	=> 'i', 
'/[éèê]/' 	=> 'e', 
'/[ÉÈÊ]/' 	=> 'E', 
'/[óòôõº]/' => 'o', 
'/[ÓÒÔÕ]/' 	=> 'O', 
'/[úùû]/' 	=> 'u', 
'/[ÚÙÛ]/' 	=> 'U', 
'/ç/' 		=> 'c', 
'/Ç/' 		=> 'C', 
'/ñ/' 		=> 'n', 
'/Ñ/' 		=> 'N',
'/[\W¿¡]+/' => '-',
'/^\-/' 	=> '\1',
'/\-$/' 	=> '\2'); 

print preg_replace(
		array_flip($reemplaza), $reemplaza, '¡Hola chic@s, ¿qué tal?');

edit: la verdad es que me he parado a hacerlo porque igual algun dia me sirve para algo personal xd.

1 respuesta
BLZKZ

#6 pero si usas array_keys y array_values no encuentra error xD :)

1 respuesta
guner

#7 mucho mejor con array_keys y array_values. No había caído en ellas.

Lecherito

Si no quieres tener muchos problemas con las url, qué más da que sea case sensitive? en una url me da igual Hola.php que hola.php, por lo tanto se reducirían prácticamente a la mitad los casos de #5 no?

PD: Hablo sin saber mucho, nada más, si es para otra cosa que no sea urls, no he dicho nada xD

Ok, no dije nada xDD

1 respuesta
BLZKZ

#9 imagino que la diferencia es minima, dado que lo que compruebo simplemente son las mayusculas de caracteres especiales (con tildes) y ahí me da igual que lo sustituya por mayusculas o minusculas, serian exactamente los mismo casos, solo que sin dividir.

No es lo mismo Ö que ö (son casos distintos a contemplar) y obviamente ambos caracteres tienen que ser sustituidos para evitar problemas.

Usuarios habituales

  • BLZKZ
  • Lecherito
  • guner