urls - validar url regex




Convierta una URL relativa a una URL absoluta (3)

No puede usar una sola expresión regular para esto, porque las expresiones regulares no pueden contar.

Deberías usar un lenguaje de programación real en su lugar. Incluso Java puede hacer esto fácilmente.

Entrada:

  • URL base: www.example.com/1/2/index.php
  • URL relativa: ../../index.php

Salida:

  • URL absoluta: www.example.com/index.php

Sería perfecto, de eso se haría usando sed .

Según tengo entendido, esta expresión regular debería eliminar una somefolder/ in por cada ../ en la URL.


Si su único requisito es convertir .. en "un nivel superior", entonces esta es una posible solución. No usa expresiones regulares o sed, o una JVM para ese asunto;)

#!/bin/bash                                                                                                                                

domain="www.example.com"
origin="1/2/3/4/index.php"
rel="../../index.php"

awk -v rel=$rel -v origin=$origin -v file=$(basename $rel) -v dom=$domain '                                                                
BEGIN {                                                                                                                                    
    n = split(rel, a, "/")                                                                                                                 
    for(i = 1; i <= n; ++i) {                                                                                                              
        if(a[i] == "..") ++c                                                                                                               
    }                                                                                                                                      
    abs = dom                                                                                                                              
    m=split(origin, b, "/")                                                                                                                
    for(i = 1; i < m - c; ++i) {                                                                                                           
        abs=abs"/"b[i]                                                                                                                     
    }                                                                                                                                      
    print abs"/"file                                                                                                                       
}'

Un enfoque alternativo al uso de awk , crédito a Edward por mencionar realpath -m :

#!/bin/bash                                                                                                                                

rel="../../index.php"
origin="www.example.com/1/2/index.php"

directory=$(dirname $origin)
fullpath=$(realpath -m "$directory/$rel")
echo ${fullpath#$(pwd)/}

realpath es una forma rápida pero ligeramente hacky de hacer lo que quieras.
(En realidad, me sorprende que no trate adecuadamente las URL, sino que las trata como simples rutas de sistemas de archivos antiguos).
~$ realpath -m http://www.example.com/1/2/../../index.php => ~$ /home/username/http:/www.example.com/index.php
La -m (por "faltante") dice que se debe resolver la ruta incluso si los componentes de la misma no existen realmente en el sistema de archivos.
Por lo tanto, aún tendrá que quitarle parte del sistema de archivos (que será $(pwd) y tenga en cuenta que la barra diagonal para el protocolo también se canonizó en una sola barra. Por lo tanto, es mejor que lo haga. deje el "http: //" fuera de su entrada y en su lugar anteponga a su salida.
Ver man 1 realpath para la historia completa. O info coreutils 'realpath invocation' para obtener una historia completa más detallada, si tienes instalado el sistema de información.





url