将相对URL转换为绝对URL

时间:2013-10-27 13:46:29

标签: regex bash url

输入:

  • 基本网址:www.example.com/1/2/index.php
  • 相对网址:../../index.php

输出:

  • 绝对网址:www.example.com/index.php

这将是完美的,可以使用 sed 完成。

据我了解,此正则表达式应为网址中的每个somefolder/删除一个../

4 个答案:

答案 0 :(得分:0)

如果您的唯一要求是将..变为“向上一级”,那么这是一种可能的解决方案。它不使用正则表达式或sed,或JVM;)

#!/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                                                                                                                       
}'

使用awk的替代方法,感谢Edward提及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)/}

答案 1 :(得分:0)

realpath是一种快速但略显愚蠢的方式来做你想做的事 (实际上,我很惊讶它没有正确处理URL;它将它们视为普通的旧文件系统路径。)
~$ realpath -m http://www.example.com/1/2/../../index.php =&gt; ~$ /home/username/http:/www.example.com/index.php
-m(表示“缺失”)表示即使文件系统上实际上不存在组件,也要解析路径。
因此,您仍然需要剥离其中的实际文件系统部分(这将只是$(pwd)。请注意,协议的斜杠也是规范化为单斜杠。所以你可能会更好将“http://”从输入中删除,然后将其添加到输出中 有关完整故事,请参阅man 1 realpath。如果你安装了信息系统,或者info coreutils 'realpath invocation'以获得更详细的全文。

答案 2 :(得分:0)

sed

中使用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

输出:

www.example.com/index.php

答案 3 :(得分:-4)

您不能使用单个正则表达式,因为正则表达式不能计数。

您应该使用真正的编程语言。甚至Java也可以轻松完成。