2013-10-27 2 views
1

Вход:Преобразование относительный URL в абсолютный URL

  • Базовый URL: www.example.com/1/2/index.php
  • Относительный URL: ../../index.php

Выход:

  • Абсолютный URL: www.example.com/index.php

Было бы идеально, это было бы сделано с использованием sed.

Как я понимаю, это регулярное выражение должно удалить один somefolder/ за каждые ../ в URL.

+0

это почти продублируйте из http://stackoverflow.com/questions/4444475/transfrom-relative-path-into-absolute-url-using-php – qdinar

ответ

-4

Вы не можете использовать для этого одно регулярное выражение, поскольку регулярные выражения не могут рассчитывать.

Вместо этого вы должны использовать настоящий язык программирования. Даже Java может сделать это легко.

0

Если ваше единственное требование - превратить .. в «на один уровень», то это возможное решение. Он не использует регулярные выражения или СЭД, или 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, кредит Эдварду за упоминание 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)/} 
0

realpath быстрый но немного хакерский способ делать то, что вы хотите.
(На самом деле, я удивлен, что он не занимается должным образом с URL-адресами, он рассматривает их как простые старые дорожки файловой системы.)
~$ realpath -m http://www.example.com/1/2/../../index.php => ~$ /home/username/http:/www.example.com/index.php
-m (для «пропавших без вести») говорит, что для того чтобы разрешить путь, даже если его компоненты на самом деле не существуют в файловой системе.
Таким образом, вам все равно придется отключить фактическую часть файловой системы (которая будет всего лишь $(pwd)). Обратите внимание, что косая черта для протокола также была канонизирована для одной косой черты. Поэтому вам может быть лучше уйти «HTTP: //» от вашего входа и просто предварять его на выходе вместо
См man 1 realpath для полного рассказа Или info coreutils 'realpath invocation' для более подробной полной истории, если у вас установлена ​​система информации

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 
Смежные вопросы