Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

Expresiones regulares

Estas en el tema de Expresiones regulares en el foro de WordPress en Foros del Web. Hola a tod@s, haber si alguien puede ayudarme. Estoy utilizando add_filter('the_content', 'mifuncion') para buscar en el contenido de los post ciertas palabras y añadirles un ...
  #1 (permalink)  
Antiguo 08/12/2013, 15:03
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Expresiones regulares

Hola a tod@s, haber si alguien puede ayudarme.

Estoy utilizando add_filter('the_content', 'mifuncion') para buscar en el contenido de los post ciertas palabras y añadirles un link. Estos links llevan un atributo title se transforma en un tooltip gracias a jquery.

El problema es que cuando en el tooltip (que es lo que esta dentro de title) aparece una palabra de las que hay que ponerle link, pues le pone link. Y esto hace que todo se destroce. No se si me he explicado muy bien, espero que lo entiendan.

Les dejo el codigo que utilizo para reemplazar las palabras por links.

Código PHP:
function reemplazar($cadena){
    
$args = array(
        
'showposts'   => -1,
        
'category_name' => 'glosario',
        
'post_type' => 'glosario',
    ); 
    
$posts_array get_posts$args );
    
$reemplaza = array();
    foreach (
$posts_array as $posts) {
        
$reemplaza[get_the_title($posts->ID)] = '<a href="' get_permalink($posts->ID) . '" title="' $posts->post_content .'">' get_the_title($posts->ID) . '</a>';
    }
    
$patterns array_keys($reemplaza);
    
$pattern_final = array();
    foreach (
$patterns as $pattern) {
        
$pattern_final[] = '/(?<=\s|^)' $pattern '(?=\s|\.|\,|$)/i';
    }
    
$cadena preg_replace($pattern_final$reemplaza$cadena1);
    return 
$cadena;
}
 
add_filter('the_content''reemplazar'); 
Como podria hacer para que no buscara dentro del atributo title de estos links? Lo unico que se me ocurre es hacer que no busque en los textos que estan entre comillas, pero como?

Gracias a todos
  #2 (permalink)  
Antiguo 08/12/2013, 15:20
Avatar de AlejandroGalvez  
Fecha de Ingreso: noviembre-2013
Mensajes: 189
Antigüedad: 11 años, 1 mes
Puntos: 49
Respuesta: Expresiones regulares

¿No es más simple crear un shortcode? Échale un ojo, ya hace toda la función de arrancar y sustituir por ti:

http://codex.wordpress.org/Shortcode_API
  #3 (permalink)  
Antiguo 09/12/2013, 03:57
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
En este caso, no me interesa hacer un shortcode porque no quiero tener que añadirlos manualmente. Intento crear un glosario y que reemplaze en cada entrada las palabras que estan en el glosario. Por eso utilizo un filtro, para que automaticamente busque en cada entrada las palabras del glosario (que son los titulos de las entradas del post type glosario).
  #4 (permalink)  
Antiguo 09/12/2013, 06:13
Avatar de Nekko
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Buenos Aires
Mensajes: 3.141
Antigüedad: 16 años, 8 meses
Puntos: 656
Respuesta: Expresiones regulares

Que estructura HTML debería tener tu tooltip para funcionar correctamente? No entiendo bien en donde está la falla.
__________________
Taller para crear themes wordpress desde cero | Presupuestos para trabajos particulares vía MP
  #5 (permalink)  
Antiguo 09/12/2013, 06:51
Avatar de AlejandroGalvez  
Fecha de Ingreso: noviembre-2013
Mensajes: 189
Antigüedad: 11 años, 1 mes
Puntos: 49
Respuesta: Expresiones regulares

Yo tampoco veo muy bien el fallo. Quizás se deba a que ejecutas varias veces el filtro the_content y por tanto se remplaza dos veces o más el contenido. Viendo el parámetro que has indicado a preg_replace() como límite, que es el 1, tu código solo debe hacer una sustitución por palabra del glosario y no más. Así que es obvio que se ejecuta el filtro más de una vez.

Puedes comprobarlo concatenando cualquier texto al final a $cadena y luego ver cuantas veces se imprime:

Código PHP:
Ver original
  1. return $cadena . ' --- Probando redundancia --- ';

Si solo se imprime una vez el texto de prueba entonces todo está en orden, aunque no debería estarlo por lo que cuentas. Tu solución es evitar que el filtro se aplique 2 o más veces al contenido del post, pues no tiene sentido y deriva en errores como el que te ocurre.

Como no se me ocurre la expresión regular que deseas, aunque si el posible problema que evita el correcto funcionamiento de la tuya, te dejo tu código más resumido y con el límite establecido a infinito como apoyo

Código PHP:
function reemplazar$cadena ) { 

    
$args = array( 
        
'showposts'   => -1
        
'category_name' => 'glosario'
        
'post_type' => 'glosario'
    );  
    
    
$posts_array    get_posts$args ); 
    
$patron            = array();
    
$remplazo        = array();
    
    foreach ( 
$posts_array as $posts ) {
        
        
$patron[]        = '/(?<=\s|^)' get_the_title$posts->ID ) . '(?=\s|\.|\,|$)/i';
        
$remplazo[]        = '<a href="' get_permalink($posts->ID) . '" title="' $posts->post_content .'">' get_the_title($posts->ID) . '</a>';
    
    } 
    
    return 
preg_replace$patron$remplazo$cadena, -); 
    

  
add_filter('the_content''reemplazar'); 
  #6 (permalink)  
Antiguo 09/12/2013, 09:29
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
Gracias por sus respuestas. La estructura del tooltip es cualquier enlace dentro del post que tenga un title. En el title va el texto que despues aparece en el tooltip.

Vuelvo a explicar lo que me pasa. Si por ejemplo tengo la palabra "vaca" en cuyo tooltip aparece la palabra "animal", que tambien esta en el glosario, animal se reemplaza por un link, que me destroza la estructura del tooltip. La solucion que yo habia pensado es no buscar dentro de los atributos de los links. Pero claro, no se como podria hacer eso.

Alejandro, no entiendo lo de que se ejecuta el filtro mas de una vez, lo de que solo reemplaze cada palabra una vez en cada post funciona.
  #7 (permalink)  
Antiguo 09/12/2013, 09:54
Avatar de AlejandroGalvez  
Fecha de Ingreso: noviembre-2013
Mensajes: 189
Antigüedad: 11 años, 1 mes
Puntos: 49
Respuesta: Expresiones regulares

Vale solo deja clara una cosa definitivamente, ¿qué quieres hacer exactamente?:

1- Localizar texto plano, fuera de etiquetas <A> o enlaces y convertirlo en un enlace con un title determinado. Ejemplo:

Código HTML:
Ver original
  1. vaca -> <a href="vaca/" title="La vaca bla bla bla...">vaca</a>

2- Localizar enlaces, etiquetas <A>, y si su texto coincide con alguna palabra del glosario indicarle un title personalizado. Ejemplo:

Código HTML:
Ver original
  1. <a href="vaca/">vaca</a> -> <a href="vaca/" title="La vaca bla bla bla...">vaca</a>

3- Ambas cosas, la 1 y la 2. Por eso tienes problemas de enlaces dentro de TITLE.

Es importante aclararlo pues la 1 se resolvería con preg_replace o preg_match_all, y la segunda con DOMDocument.
  #8 (permalink)  
Antiguo 09/12/2013, 12:40
laura_moreno14
Invitado
 
Mensajes: n/a
Puntos:
La primera, buscar texto plano que no este en un enlace (tampoco en el title del enlace) y convertirlo en un link con un href y title determinados.

La parte se reemplazar la palabra por el link me funciona. El problema es que tambiem busca dentro de las etiquetas.

Etiquetas: expresiones, post, regulares
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




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