Problema con expresión regular algo compleja

MrTurbo

Buenas tardes

Por más que busco no soy capaz de encontrar (y mucho menos de hacer, no se me dan nada bien las expresiones regulares) una expresión regular que me permita reemplazar, dentro de un texto, palabras o frases cortas que yo le indique, pero que solo las reemplace si estas palabras están fuera de etiquetas <a>, <h1>, etc.

Básicamente quiero reemplazar palabras por enlaces a esas palabras, pero necesito que esas palabras no estén dentro de otros enlaces, src, etc.

Decir que la búsqueda y reemplazo se haría en PHP

A ver si podéis echarme una mano :)

Un saludo

PiradoIV

Ayudaría mucho un texto con el ejemplo concreto

Ulmo

Como las etiquetas esten en lineas diferentes, yo creo q directamente no lo vas a poder hacer.

1 respuesta
soanix

Pregunta, el texto/urls están registrados/as en base de datos?

1 respuesta
MrTurbo

Pues si #3, es posible que coincida que las etiquetas estén en lineas diferentes.

Si #4, el texto esta en un campo de la base de datos

Un ejemplo... pues algo del estilo:
La tercera generación del clase M de Mercedes saldrá a la venta con 3 motorizaciones disponibles. El downsizing de los motores, la combustión pobre, START/STOP (presente de serie en toda la gama de motores), turbos en serie, bombas de agua, aceite, aire acondicionado y polea del alternador desconectables y demás avances tecnológicos que están presentes en las nuevas generaciones de motores, consiguen que este modelo consuma un 25% menos que su predecesora. Esto hace que, por ejemplo, el ML 250 BlueTEC 4MATIC homologue un consumo de 6.0 litros a los 100km, con unas emisiones de tan solo 158g CO2/km

Donde lo que está en negrita se reemplace por un enlace que lleve a una especie de diccionario (otra página) con cada uno de los significados.

Yo tendría un array con cada una de las palabras clave a buscar y su url, por así decirlo, y un texto similar al que expongo.

¿Alguna idea?

Muchas gracias :)
Saludos

MrTurbo

Ah, se me olvidaba.

El problema es que algunas de esas palabras clave pueden ir ya dentro de un enlace o de alguna etiqueta (h1, por ejemplo) y ahí no quiero que se haga el reemplazo.

LOc0

Con una sola llamada ahora mismo no lo veo. Podrías probar a sustituir las etiquetas problemáticas:

<a href="blablabla">blablabla</a>
<h1>blablabla</h1>

por $1, $2, etc... (y te guardas en un array la etiqueta completa).
http://php.net/manual/es/function.preg-replace-callback.php

Después reemplazas las palabras clave por su enlace. Para terminar sustituyes todos los $1, $2, etc... por el contenido que tenían al principio.

¿Algo más eficiente? Seguramente, pero a mejor precio lo dudo xD

ejemplo

Salu2 ;)

3 respuestas
MrTurbo

Muchísimas gracias #7

Mañana por la mañana lo pruebo y te comento :-)

Un saludo

eXtreM3

#7 esa función me la guardo, GRANDE

MrTurbo

#7 Muchísimas gracias

Lo he probado y funciona, el único "pero" (si es que puede haber alguno) es que no me reemplace partes de palabra. Por ejemplo:

Si yo tengo:
"pretende mantener unas buenas cualidades dinámicas off-road y además mantener confort en la carretera."

Y esta palabra para reemplazar:
'carrete'

Lo que hace esa función es en la palabra carretera sólo reemplazarme por un enlace la palabra carrete.

¿Sería muy difícil modificar la expresión para que sea necesario que tenga espacio delante y detrás?

De nuevo, millones de gracias

LOc0

¡Ah coño! Es cierto, palabras sueltas.

palabras_sueltas_y_etiquetas_recursivas(ahora sí)

Salu2 ;)

1 respuesta
eisenfaust

Típico momentazo "¿Por qué no elegí Perl?" xDDD

MrTurbo

#11 Muchisimas gracias

Si lo pruebo con un texto como ese, corto, funciona sin problemas.

Pero si cojo y repito ese mismo texto muchas veces (9 veces, por ejemplo) para hacer un texto más largo el servidor me devuelve un error 500, y el log del servidor apache dice:

Connection reset by peer: mod_fcgid: read data from fastcgi server error.
Premature end of script headers: php5.cgi

¿Alguna idea?

LOc0
mira a ver así

Salu2 ;)

1 respuesta
MrTurbo

#14 funciona, pero sigue estando el problema de que no reemplace partes de palabra

keyword -> carrete

blabla carretera blabla

Millones de gracias again :-)

LOc0

Hola. Pues entonces no te he entendido bien. Ahora mismo sólo sustituye palabras sueltas, es decir, que delante y detrás no tengan letras. Lo acabo de probar con 'merced' en vez de 'mercedes' y no sustituye.

Salu2 ;)

PD: he modificado una cosa del post anterior para hacer más eficiente la expresión regular.

1 respuesta
MrTurbo

#16

Con lo que has modificado ahora ni siquiera funciona, viene vacío el texto :(

Saludos

LOc0

Pégame en pastebin o donde sea el texto que estás usando porque no entiendo...

Salu2 ;)

1 respuesta
MrTurbo

#18
http://pastebin.com/aXWkV3bN

Saludos :)

LOc0
prueba_con_esto

Salu2 ;)

1 respuesta
MrTurbo

#20

Muchas gracias, te comento:

Estoy probando con este array de prueba, para que veas que no cumple lo de que reemplace solo cuando tiene espacios delante y detrás (o coma y punto, vamos, que lo que haya después no sea una letra).

$_enlcDicc = array(
    'accidente'  => 'http://google.es',
    'modelo'     => 'http://google.es',
    'ventanilla' => 'http://google.es',
    'carrete'    => 'http://google.es'
);


echo link_replace($texto, $_enlcDicc, array('a', 'img', 'h1', 'h2'));

Sólo falla eso, en lo demás va perfecta :)

Espero no ser demasiado pesado ;)

Un abrazo

LOc0

Jejeje, un pequeño despiste que no veía ya que en mi ejemplo usaba un array con sólo una palabra clave.

Salu2 ;)

1 respuesta
MrTurbo

#22

¡Muchísimas gracias! Funciona perfecto, eres un crack.

He estado mirando de que solo me haga el reemplazo una vez por keyword, no entiendo muy bien la expresión regular, ¿sería fácil decirle que sólo haga un reemplazo por palabra?

Un abrazo tío, te debo unas cañas :-)

LOc0
solo_un_reemplazo_por_palabra_clave

Salu2 ;)

1 respuesta
MrTurbo

#24

Perfecto, te debo unos cubatas. Si vienes por Coruña estás más que invitado :-)

Un abrazo

Usuarios habituales

  • MrTurbo
  • LOc0
  • eisenfaust
  • eXtreM3
  • soanix
  • Ulmo
  • PiradoIV