validar valid urls pattern online link for regex bash url

valid - regex website



Convierta una URL relativa a una URL absoluta (4)

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.


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.


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)/}


Usando sed dentro de bash

#!/bin/bash base_url=''www.example.com/1/2/index.php'' rel_url=''../../index.php'' str="${base_url};${rel_url}" str=$(echo $str | sed -r ''s#/[^/]*;#/#'') while [ ! -z $(echo $str | grep ''/./.'') ] do str=$(echo $str | sed -r ''s#/w+//././##'') done abs_url=$str echo $abs_url

Salida:

www.example.com/index.php


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.