Foros del Web » Programando para Internet » PHP »

Problemas con reemplazos en una expresión regular

Estas en el tema de Problemas con reemplazos en una expresión regular en el foro de PHP en Foros del Web. Tengo un problema con un reemplazo de acentos. Primero armé una pequeña función para aplicar la sustitución que necesito: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código php: Ver original ...
  #1 (permalink)  
Antiguo 15/06/2009, 08:06
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Problemas con reemplazos en una expresión regular

Tengo un problema con un reemplazo de acentos. Primero armé una pequeña función para aplicar la sustitución que necesito:

Código php:
Ver original
  1. function sin_acentos( $texto ) {
  2.   $trad = array(
  3.     'Á'  =>  'A1',
  4.     'É'  =>  'E1',
  5.     'Í'  =>  'I1',
  6.     'Ó'  =>  'O1',
  7.     'Ú'  =>  'U1',
  8.     'á'  =>  'a1',
  9.     'é'  =>  'e1',
  10.     'í'  =>  'i1',
  11.     'ó'  =>  'o1',
  12.     'ú'  =>  'u1',
  13.     'Ñ'  =>  'N1',
  14.     'ñ'  =>  'n1'
  15.   );
  16. return(strtr($texto,$trad));
  17. }

Luego hice esta otra función para reemplazar caracteres con un atajo pero no me funciona:

Código php:
Ver original
  1. function contenido($contenido) {
  2.   $contenido = preg_replace( '|\[c=(.*?)\]|', '<span class="letra-'.sin_acentos('$1').'">$1</span>' , $contenido );
  3. }

El resultado es que anula todo el preg_replace y me devuelve el atajo tal como está escrito, por ejemplo "[c=A]", cuando lo que debería aparecer es algo como esto (suponiendo que esté la letra "Ñ"):

Código html:
Ver original
  1. <span class="letra-N1">Ñ</span>

¿Cómo le hago?.
  #2 (permalink)  
Antiguo 15/06/2009, 08:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas con reemplazos en una expresión regular

mmm... la funcion a ejecutar con preg_replace() debe ser evaluada, osea... literal, pero debes usar el modificador de evaluación (e)

http://www.forosdelweb.com/f18/aport...ml#post2670913


revisa el manual, o bien, usa preg_replace_callback(), para utilizar un funcion mas cómodamente...

Código PHP:
function bar($match)
{
  
var_dump($match);
}

$foo preg_replace('/.*/e''foo("\\0")'$foo);
$foo preg_replace_callback('/.*/''foo'$foo); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 15/06/2009, 08:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problemas con reemplazos en una expresión regular

Yo trate lo que tu escribiste y me devuelve

[c=Á] = <span class="letra-Á">Á</span>
[c=É] = <span class="letra-É">É</span>
[c=Ñ] = <span class="letra-Ñ">Ñ</span>


Así sucesivamente. ¿Como tu deseas que te devuelva la función?
  #4 (permalink)  
Antiguo 15/06/2009, 08:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas con reemplazos en una expresión regular

Cita:
Iniciado por abimaelrc Ver Mensaje
[...] ¿Como tu deseas que te devuelva la función?
Cita:
Iniciado por metacortex Ver Mensaje
[...]
Código html:
Ver original
  1. <span class="letra-N1">Ñ</span>

[...]

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 15/06/2009, 09:02
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problemas con reemplazos en una expresión regular

Gracias por las respuestas. Estuve probando con preg_replace_callback y el error me pide un "argumento 2":

Código HTML:
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '<span class="letra-$1">$1</span>', to be a valid callback in /var/www/meta/functions.php on line 58
He probado con varias opciones en el 2do argumento y aún nada.

Cita:
Iniciado por pateketrueke
revisa el manual
No tienes idea desde hace cuánto lo tengo atornillado en la frente .
  #6 (permalink)  
Antiguo 15/06/2009, 09:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas con reemplazos en una expresión regular

no quiero ser ofensivo, tu lo sabes...

pero el manual es muy claro
Cita:
Iniciado por http://php.net/preg_replace_callback
mixed preg_replace_callback ( mixed $pattern , callback $callback , mixed $subject [, int $limit= -1 [, int &$count ]] )
incluso el mensaje de error es aun mas aclarador, el segundo argumento debe ser un callback valido (mira el ejemplo anterior que coloque)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 15/06/2009, 09:31
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problemas con reemplazos en una expresión regular

A ver. El ejemplo que pusiste:

Código php:
Ver original
  1. preg_replace_callback('/.*/', 'bar', $foo);

¿No será así, teniendo en cuenta la función que escribiste más arriba?:

Código php:
Ver original
  1. preg_replace_callback('/.*/', 'bar', $foo);

Eso fue lo mismo que hice, pero no sé cómo encajar el "$1" en ese 2do argumento y aplicarle la función de los acentos. Bueno, ya saldrá. Gracias por todo.
  #8 (permalink)  
Antiguo 15/06/2009, 09:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas con reemplazos en una expresión regular

jeje, tus dos código son idénticos... mira este ejemplo completo

Código PHP:
function reemplazar_callback($match)
{
  return 
sin_acentos($match[1]); // (.*?) = $1 = \\1
}

function 
contenido($contenido)
{
  return 
preg_replace_callback'/\[c=(.*?)\]/iU''reemplazar_callback'$contenido);

efectivamente el callback te permite procesar sin necesidad de comodines $N
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 15/06/2009, 10:17
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problemas con reemplazos en una expresión regular

Ah carajo! Imagínate, cuándo se me iba a ocurrir esa vaina jeje. Estaba en las nebulosas.

Entonces hay que crear una tercera función que prepare a la de los acentos para introducirla en el argumento. Hermano, ni se me había pasado por la cabeza. Gracias mil por el empujón.

Mierda y lo peor es que estuvo frente a las narices todo el tiempo. Lo que no pude descifrar fue lo de esa nueva función.

Cita:
Iniciado por pateketrueke
jeje, tus dos código son idénticos...
Sí, el primero era con "foo". Vainas del copypaste =P
  #10 (permalink)  
Antiguo 16/06/2009, 10:31
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problemas con reemplazos en una expresión regular

Lo logré!!! ... Lo logré!!! . Home run!!! Gooollll!!!

Me costó medio cojón pero al fin salió. En serio gente, qué difícil se me hizo entender cómo funcionaba. Miré docenas de ejemplos, me grabé el manual de memoria y aún no lo lograba. Esta madrugada me levanté insistiendo de nuevo y a esta hora es que vengo acertando.

Dejo el código aquí para la posteridad :

La función de los reemplazos quedó exactamente igual que al principio.

Código php:
Ver original
  1. function sin_acentos( $texto ) {
  2.   $trad = array(
  3.     'Á'  =>  'A1',
  4.     'É'  =>  'E1',
  5.     'Í'  =>  'I1',
  6.     'Ó'  =>  'O1',
  7.     'Ú'  =>  'U1',
  8.     'á'  =>  'a1',
  9.     'é'  =>  'e1',
  10.     'í'  =>  'i1',
  11.     'ó'  =>  'o1',
  12.     'ú'  =>  'u1',
  13.     'Ñ'  =>  'N1',
  14.     'ñ'  =>  'n1'
  15.   );
  16. return(strtr($texto,$trad));
  17. }

Creé una variable para la expresión regular, aunque creo que también funcionaría con datos estáticos:

Código php:
Ver original
  1. $reg_reemp = '|\[c=(.*?)\]|';

La función para reemplazar el atajo por la etiqueta HTML. Aquí metí toda la etiqueta de cabo a rabo y le apliqué la función sin_acentos() de una vez a la zona que me interesaba sustituir. Es decir, lo que aprendí es que el argumento del preg_replace_callback debe estar limpio, y todo lo que se vaya a ejecutar se ejecuta afuera:

Código php:
Ver original
  1. function carac_reemplazo($match) {
  2.     return '<span class="capitular letra-' . sin_acentos( $match[1] ) . '">' . $match[1] . '</span>';
  3. }

Finalmente el preg_replace_callback:

Código php:
Ver original
  1. $contenido = preg_replace_callback($reg_reemp ,'carac_reemplazo' , $contenido);

Bueno así ha terminado este lío. Gracias de nuevo pateketrueke por proporcionarme la orientación básica sin llegar a darme la papita pelada .
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:33.