Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   PHP (http://www.forosdelweb.com/f18/)
-   -   Problemas con reemplazos en una expresión regular (http://www.forosdelweb.com/f18/problemas-con-reemplazos-expresion-regular-709749/)

metacortex 15/06/2009 08:06

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?.

pateketrueke 15/06/2009 08:14

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); 


abimaelrc 15/06/2009 08:32

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?

pateketrueke 15/06/2009 08:40

Respuesta: Problemas con reemplazos en una expresión regular
 
Cita:

Iniciado por abimaelrc (Mensaje 2962572)
[...] ¿Como tu deseas que te devuelva la función?

Cita:

Iniciado por metacortex (Mensaje 2962536)
[...]
Código html:
Ver original
  1. <span class="letra-N1">Ñ</span>

[...]


:pensando:

metacortex 15/06/2009 09:02

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 :golpeado:.

pateketrueke 15/06/2009 09:20

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)

metacortex 15/06/2009 09:31

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.

pateketrueke 15/06/2009 09:37

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

metacortex 15/06/2009 10:17

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. :golpeado:

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

metacortex 16/06/2009 10:31

Respuesta: Problemas con reemplazos en una expresión regular
 
Lo logré!!! :neurotico ... Lo logré!!! :'( :'( . Home run!!! Gooollll!!! :cool:

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 :borracho::

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 :arriba:.


La zona horaria es GMT -6. Ahora son las 10:05.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.