Foros del Web » Programando para Internet » Javascript »

Expresion regular por la derecha

Estas en el tema de Expresion regular por la derecha en el foro de Javascript en Foros del Web. Hola estoy trabajando con expresiones regulares y queria detectar en una cadena tipo http://www.google.com/?url=http://www.dot.tk/?url=http://www.fin.com el ultimo http:... es decir http://www.fin.com Tenia la expresion regular Código ...
  #1 (permalink)  
Antiguo 31/10/2007, 06:00
 
Fecha de Ingreso: marzo-2005
Mensajes: 47
Antigüedad: 19 años, 7 meses
Puntos: 0
Pregunta Expresion regular por la derecha

Hola
estoy trabajando con expresiones regulares y queria detectar en una cadena tipo

http://www.google.com/?url=http://www.dot.tk/?url=http://www.fin.com
el ultimo http:... es decir http://www.fin.com

Tenia la expresion regular

Código PHP:
/https?(:|%3a)(/|%2f)(/|%2f)/ 
pero eso se queda en el primer http y no en el ultimo
asi que cree esta funcion:

Código PHP:
var getRegExpDerecha = function(regExpStr) {
    return (
regExpStr==null || regExpStr.length==0)?null:new RegExp(regExpStr+"(?!=.*"+regExpStr+".*)","i");

a la que le paso por parametro "https?(:|%3a)(\\/|%2f)(\\/|%2f)"
con la idea que "(?!="... X(?!=Y) captura X cuando no le sigue Y
sin embargo sigue devolviendome el primer http en vez del ultimo

finalmente he hecho esta funcion:

Código PHP:
var matchDerechaIndex = function (str,expReg) {
    if (
str==null || expReg==null) return -1;
    var 
_index=0;
    var 
_match;
    var 
strAux=str;
    while ((
_match=strAux.match(expReg))!=null) {
            
_index+=(_match.index+1);
            
strAux=str.substr(_index);
    }
    return (
_index-1);

que si me devuelve el index donde se encuentra el ultimo http
pero estoy convencido de que deberia haber otra solucion que usara unicamente la expresion regular en un solo match

¿tengo algo mal en la sintaxis de la expresion regular? ? X(?!=Y) no significa lo que creo? no se puede hacer en javascript?

Gracias. Hasta luego.
__________________
Visita www.GranFuckultad.tk y goza de risa

Última edición por Cyttorak; 31/10/2007 a las 06:05
  #2 (permalink)  
Antiguo 31/10/2007, 08:45
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 10 meses
Puntos: 3
Re: Expresion regular por la derecha

al final de la expresion regular pon: $

Eso le indica que la cadena tiene que terminar ahi.

Si siempre va a terminar de la forma: ?url=http://........

la expresion podria ser:

"\?url=(http://.*)$"

\? --> indica que tiene que haber un caracter ?, se pone la barra porque existe un operador ?.
url= --> nombre de la variable
(http://.*) --> direccion URL que queremos capturar. Lo ponemos entre parentesis para que guarde el resultado. Despues se puede ver el valor con RegExp.$1 . Mas informacion en google

$ --> Para que no haya más caracteres.

Una vez que lo tienes, prueba con la función test para evaluar si coincide...

Saludos
  #3 (permalink)  
Antiguo 31/10/2007, 08:49
 
Fecha de Ingreso: marzo-2005
Mensajes: 47
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Expresion regular por la derecha

Pero es que en ese .* cabria el segundo http, y el tercero, y el quinto...
seguiria parandose en el primer http

Tampoco puedo generalizar lo de "url"
el codigo esta pensado para coger cualquier url que tenga otra url como parametro en la query (y en concreto la ultima que aprezca) sin saber como se llama el parametro
__________________
Visita www.GranFuckultad.tk y goza de risa
  #4 (permalink)  
Antiguo 31/10/2007, 09:19
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Re: Expresion regular por la derecha

Hola:

En una url el primer carácter "?" es el comienzo de los parámetros... y en el resto de url no debría aparecer otra vez, porque se envían "escapados"...

Prueba este ejemplo:

Código:
<html>
<body onload="alert(escape('?') + ': ' + unescape('%3F'))" >
</body>
</html>
Esto significa que la url:
http://www.google.com/?url=http://www.dot.tk/?url=http://www.fin.com
no es correcta, y sí lo sería:
http://www.google.com/?url=http://www.dot.tk/%3Furl=http://www.fin.com

Siempre que envíes variables por url sin usar formularios, debes acostumbrarte a "escaparlos"

Espero que te sirva.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 31/10/2007, 09:32
 
Fecha de Ingreso: marzo-2005
Mensajes: 47
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Expresion regular por la derecha

Esto es para usarlo contra webs que no se quien ha hecho

en algunas no escapan el "?"

y de todos modos no me serviria, porque por decirlo de alguna manera
esto debe ser "recursivo"

si la url original es

url1?noseque=url2

no me basta con quedarme con la url2, si esa url2
por dentro es url2.1?nosequeBis=url2.2
entonces tendria que quedarme con url2.2

en cualquier caso siempre tiene que ser la ultima (este escapada o no, por eso en la expresion regular se contemplan los dos casos para los "://")
__________________
Visita www.GranFuckultad.tk y goza de risa
  #6 (permalink)  
Antiguo 31/10/2007, 17:21
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 10 meses
Puntos: 3
Re: Expresion regular por la derecha

Si no lo he entendido mal deberia de funcionar esto:

"\?[^=]+=((http://)?.*)$"

(http://)? es por si en la URL solo viene www.url.com

[^=]+ indica calquier cosa menos el signo igual, al menos un caracter

Saludos
  #7 (permalink)  
Antiguo 02/11/2007, 03:00
 
Fecha de Ingreso: marzo-2005
Mensajes: 47
Antigüedad: 19 años, 7 meses
Puntos: 0
Pregunta Re: Expresion regular por la derecha

Cita:
Iniciado por wigglyUtrera Ver Mensaje
Si no lo he entendido mal deberia de funcionar esto:

"\?[^=]+=((http://)?.*)$"

(http://)? es por si en la URL solo viene www.url.com

[^=]+ indica calquier cosa menos el signo igual, al menos un caracter

Saludos
Eso seguiria encontrando solo el primer http despues de "?" pero si hubiera otro despues no lo cogeria
y yo quiero el ultimo de todos, y no puedo preeveer cuantos niveles de anidamiento habra, por asi decirlo
__________________
Visita www.GranFuckultad.tk y goza de risa
  #8 (permalink)  
Antiguo 02/11/2007, 12:31
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 10 meses
Puntos: 3
Re: Expresion regular por la derecha

pues seria asi:

"[^=]+=((http://)?.*)$"

Asi deberia coger el ultimo de todos...seguro

Saludos
  #9 (permalink)  
Antiguo 05/11/2007, 03:14
 
Fecha de Ingreso: marzo-2005
Mensajes: 47
Antigüedad: 19 años, 7 meses
Puntos: 0
Exclamación Re: Expresion regular por la derecha

No, eso tampoco valdria porque el .* se lo come todo, incluso un http que podria venir despues del primero

Pero ya da igual
ya se como se hace

La expresion correcta es X(?!Y)
eso significa "Encontrar X cuando no le sigue Y"

Asi que mi funcion para crear expresiones regulares que me devuelvan la ultima ocurrencia seria asi:

Código PHP:
var getRegExpDerecha = function(regExpStr) {
    return (
regExpStr==null || regExpStr.length==0)?null:new RegExp(regExpStr+"(?!.*"+regExpStr+".*)","i");

Es decir, el error era el "=" :P
__________________
Visita www.GranFuckultad.tk y goza de risa
  #10 (permalink)  
Antiguo 05/11/2007, 09:24
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 10 meses
Puntos: 3
Re: Expresion regular por la derecha

esto funciona:

Código HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Untitled</title>
<script language="JavaScript" type="text/javascript">
<!--
function prueba(){
expreg = new RegExp("[^=]+=(([url]http://)?[^&]+)$");
if(expreg.test(document.URL))
					alert(RegExp.$1);
else
					alert("ERROR");
}
//-->
</script>

</head>
<body onload="prueba()">

</body>
</html> 
Saludos
  #11 (permalink)  
Antiguo 05/11/2007, 09:33
 
Fecha de Ingreso: marzo-2005
Mensajes: 47
Antigüedad: 19 años, 7 meses
Puntos: 0
Exclamación Re: Expresion regular por la derecha

eso le pasa lo mismo que ya he dicho antes
coge el primer http que aperezca como parametro
pero no el ultimo

si la direcion es http://www.blabla.com/?url1=http://uno.com&url2=http://dos.com o http://www.blabla.com/?url1=http://uno.com?url2=http://dos.com

cogeria http://uno.com en vez de http://dos.com

La opcion correcta es la que dije en mi ultimo post:
usar la expresion X(!?Y) (encontrar x si y solo si no le sigue y)

y para este caso en particular seria:

Código PHP:
https?(:|%3a)(/|%2f)(/|%2f)(?!.*https?(:|%3a)(/|%2f)(/|%2f).*) 
Esto si que cogeria http://dos.com pues este es el ultimo http (el unico que cumple ser "http..." y no estar seguido de nada que contenga otro "http...")

No pongo el "=" porque yo ya trabajo directamente con la query, asi que no corro peligro de coger el http original, pero si eso se podria añadir igualmente a la expresion regular

Nota: ya me doy cuenta que no eso solo me sirve para coger donde empieza el ultimo http y que luego deberia cortar en el & o # segun el caso (porque no se puede haber a las brabas, ya que el "#" o el "&" podria ser parte de la propia url que quiero capturar) por eso no añado en la expresion regular que busque hasta final de cadena o hasta alguno de esos caracteres ;)
__________________
Visita www.GranFuckultad.tk y goza de risa

Última edición por Cyttorak; 05/11/2007 a las 09:40
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 18:25.