Foros del Web » Programando para Internet » Javascript »

expresion regular

Estas en el tema de expresion regular en el foro de Javascript en Foros del Web. estoy haciendo una expresion regular que reemplace una palabra dada en una cadena siempre cuando dicha palabra no este embebida con una etiqueta a de ...
  #1 (permalink)  
Antiguo 26/01/2013, 10:58
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
expresion regular

estoy haciendo una expresion regular que reemplace una palabra dada en una cadena siempre cuando dicha palabra no este embebida con una etiqueta a de html.
estoy un poco perdido, esto es lo que he hecho . gracias de antemano.



Código PHP:

"[^<[a-z]*[^>]*>]" variable + @"[^<\/[a-z]*>]" 
  #2 (permalink)  
Antiguo 26/01/2013, 18:26
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 6 meses
Puntos: 127
Respuesta: expresion regular

Las expresiones regulares se construyen o bien literalmente o usando new RegExp()

expr = new RegExp("[^<[a-z]*[^>]*>]" + variable + @"[^<\/[a-z]*>]" );

y omitiendo el símbolo @ que has debido meter por error.

Luego, hay cuestiones que no entiendo:

El grupo es incorrecto porque ^ sólo incluye un grupo de no coincidencia, lo cual todo lo demás lo ignorará. Además de que [a-z] no tiene nada que ver.

En base a lo que dices un conjunto similar podría valerte

"(?:<a.*> +){0}" + variable + "(?! *<\/a>)"

coincidirá siempre y cuando coincida con cualquier cosa que contenga 0 veces <a ****> (?:<a.*>){0} seguido de variable y si no está seguido por </a> (?!grupo)

eso significa que

<a>variable sólo capturará variable

y

<a>variable</b> donde también sólo capturará variable

y en

<a href="asd.html">variable</a> no lo capturará porque coincide con la expresión.

( *) se usa para que coincida aunque incluya uno o varios espacios y ?: para que el grupo no se capture.

Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 26/01/2013 a las 18:38
  #3 (permalink)  
Antiguo 27/01/2013, 09:37
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
Respuesta: expresion regular

Muchisimas gracias!! me ha servido enormemente pero ahora tengo otro asunto y es que si la palabra que estoy buscando se encuientra en la propiedad href. ej:

1. <a href="loque sea adelante variable lo que sea despues">otro valor o variable</a>
  #4 (permalink)  
Antiguo 27/01/2013, 09:59
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
Respuesta: expresion regular

(?:<a\s*href.*pdvsa.*){0}|(?:<a.*>){0}pdvsa(?!<\/a>)

hice una expresión de esta manera y me ha funcionado pero quería verificar si es la manera más efectiva para esta expresión. es decir, quisiera saber tu opinión.



Muchas gracias de igual manera.
  #5 (permalink)  
Antiguo 27/01/2013, 10:06
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
Respuesta: expresion regular

la probé bien esta mala sorry
  #6 (permalink)  
Antiguo 27/01/2013, 12:05
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
Respuesta: expresion regular

no he podido resolver este royo, mi idea es que la "variable" no este en la propiedad href ni entre la etiquetas de apertura y cierre del enlace. Gracias.
  #7 (permalink)  
Antiguo 27/01/2013, 12:13
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: expresion regular

Podés dar algunas precisiones

La palabra a buscar y reemplazar, siempre es la misma, o puede variar?
la palabra de susbstitución, siempre es la misma?
la cadena dada, la extraés del DOM de un documento?

Ejemplo1:
Reemplazar pvdsa x ZZZZZ
<p>titulo: pdvsa<br />
<a href="#">pdvsa</a>
</p>

debería quedar

<p>titulo: ZZZZZ<br />
<a href="#">pdvsa</a>
</p>

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #8 (permalink)  
Antiguo 27/01/2013, 12:32
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
Respuesta: expresion regular

si por ejemplo quiero sustituir "pdvsa" en el texto dado por "<a href='#'>pdvsa</a>" que no me afecte ni la palabra "pdvsa" que esta en el href ni entre las etiquetas de apertura y cierre.

<a href="http://www.pdvsa.com">pdvsa</a>

con la ayuda de dontexplain no afecto a la palabra que esta en entre las etiquetas peri si la que esta en la propiedad href.
  #9 (permalink)  
Antiguo 28/01/2013, 02:13
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 6 meses
Puntos: 127
Respuesta: expresion regular

Cita:
Iniciado por Fabian olmos Ver Mensaje
si por ejemplo quiero sustituir "pdvsa" en el texto dado por "<a href='#'>pdvsa</a>" que no me afecte ni la palabra "pdvsa" que esta en el href ni entre las etiquetas de apertura y cierre.

<a href="http://www.pdvsa.com">pdvsa</a>
Si quieres sustituir la palabra cómo no va a afectarla.

Explica mejor porque no entiendo.

Si lo que quieres es que en un texto con pdvsa lo sustituya por

<a href="http://www.pdvsa.com">pdvsa</a>

necesitas la función replace

texto.replace("pdvsa","<a href='www.pdvsa.com'>pdvsa</a>");
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #10 (permalink)  
Antiguo 28/01/2013, 03:33
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 11 meses
Puntos: 0
Respuesta: expresion regular

Es decir, en un texto dado no quiero afectar esa línea porque me rompería el enlace. Ej:

<a href="http://www.Pdvsa.com" class="Link">Pdvsa</a> es una empresa petrolera, Pdvsa manda petróleo.

Entonces dada esta línea el patrón me debería tomar sólo la palabra Pdvsa que está fuera de las etiquetas de apertura y cierre del enlace y fuera del valor de la propiedad href


Gracias por responder
  #11 (permalink)  
Antiguo 28/01/2013, 04:01
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 6 meses
Puntos: 127
Respuesta: expresion regular

Cita:
(?!<a.*|href=')(pdvsa)(?!<\/a>|')
Coincide con pdvsa siempre que no vaya precedido de <a seguido de lo que sea ó href=' y seguido de </a>, o sea, siempre que no esté entre <a> y </a> pero en cuando añades algo antes o después se rompe.

Habría que afinarlo mucho más porque son expresiones muy complejas las que buscas.

Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 28/01/2013 a las 04:07
  #12 (permalink)  
Antiguo 28/01/2013, 07:14
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: expresion regular

Sigo insistiendo con lo planteado en
http://www.forosdelweb.com/f13/expre...7/#post4356641
Como ya te han expresado, hay muchos inconvenientes en utilizar una expresión regular.
Esta podría ser una alternativa, ahora que si el texto en el cual reemplazar proviene sencillamente de una cadena, no sirve (podrías llegado el caso hacerse algo con php)
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es-ar">
  3. <meta charset="utf-8" />
  4. <title>Reemplazar Texto</title>
  5. <script type="text/javascript">
  6. //<![CDATA[
  7. function reemplazar() {
  8. var a =document.body.getElementsByTagName("*");
  9. for (i=0; i < a.length; i++) {
  10. var texto =a[i].innerHTML;
  11. // utilizamos una palabra clave, emprear, y substituimos en todo el documento, en todos los nodos
  12. a[i].innerHTML = texto.replace(/pdvsa/gi,"emprear");
  13. }
  14.  
  15. // revertimos la substitución en los tags A, reestablecemos el title, href e innerHTML
  16. var b =document.body.getElementsByTagName("a");
  17. for (c=0; c < b.length; c++) {
  18. var titulo = b[c].title;
  19. var links = b[c].href;
  20. var contenido = b[c].innerHTML;
  21. if(titulo){
  22. b[c].title = titulo.replace(/emprear/gi,"pdvsa");
  23. }
  24. b[c].href = links.replace(/emprear/gi,"pdvsa");
  25. b[c].innerHTML = contenido.replace(/emprear/gi,"pdvsa");
  26. }
  27.  
  28. alert(document.body.innerHTML);
  29.  
  30. }
  31. //]]>
  32. </head>
  33. <h1>Pdvsa</h1>
  34. <h4 id="demo">petroleo <a href="pdvsa.html" title="pdvsa 1 t">pdvsa 1</a> pdvsa</h4>
  35. <div><p><a href="pdvsa.html">pdvsa 2 </a></p></div>
  36. <div><p><a href="pdvsa.html" title="pdvsa 3 t"><span>pdvsa 3 </span></a></p></div>
  37. <pre>
  38.     pdvsa
  39.     PDVSA
  40.     Pdvsa
  41. </pre>
  42. <button onclick="reemplazar()">reemplazar</button>
  43. </body>
  44. </html>

Habría que corregir ó afinar un detalle, el caso de las mayúsculas/minúsculas en los hrefs de los links

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #13 (permalink)  
Antiguo 28/01/2013, 11:14
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 6 meses
Puntos: 127
Respuesta: expresion regular

Y el inconveniente principal es desarrollar esa expresión que es bastante complejo por lo enrevesado.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Etiquetas: expresion, html, regular
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 02:03.