3

私は DOM をロードしたページを持っているので、最終的に<base href>タグに従って、アンカーのすべての相対 URL を絶対 URL に変換したいと考えています。

場合によっては失敗するランダムなスクリプトではなく、テスト済みのものを探しています

href="" の使用のすべての形式の解析に興味があります。

href="relative.php"
href="/absolute1.php"
href="./relative.php"
href="../relative.php"
href="//absolutedomain.org"
href="." relative
href=".." relative
href="../" relative
href="./" relative

より複雑なものが混在

前もって感謝します

4

2 に答える 2

1

この関数は、相対 URL を正規表現なしで指定された現在のページ URLに解決します。それは正常に解決します:$pgurl

/home.php?example種類、

同じディレクトリnextpage.phpの種類、

../...../.../parentdir種類、

完全なhttp://example.netURL、

および短縮//example.netURL

//Current base URL (you can dynamically retrieve from $_SERVER)
$pgurl = 'http://example.com/scripts/php/absurl.php';

function absurl($url) {
 global $pgurl;
 if(strpos($url,'://')) return $url; //already absolute
 if(substr($url,0,2)=='//') return 'http:'.$url; //shorthand scheme
 if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url; //just add domain
 if(strpos($pgurl,'/',9)===false) $pgurl .= '/'; //add slash to domain if needed
 return substr($pgurl,0,strrpos($pgurl,'/')+1).$url; //for relative links, gets current directory and appends new filename
}

function nodots($path) { //Resolve dot dot slashes, no regex!
 $arr1 = explode('/',$path);
 $arr2 = array();
 foreach($arr1 as $seg) {
  switch($seg) {
   case '.':
    break;
   case '..':
    array_pop($arr2);
    break;
   case '...':
    array_pop($arr2); array_pop($arr2);
    break;
   case '....':
    array_pop($arr2); array_pop($arr2); array_pop($arr2);
    break;
   case '.....':
    array_pop($arr2); array_pop($arr2); array_pop($arr2); array_pop($arr2);
    break;
   default:
    $arr2[] = $seg;
  }
 }
 return implode('/',$arr2);
}

使用例:

echo nodots(absurl('../index.html'));

nodots()URL が絶対 URL に変換されたに呼び出す必要があります。

ドット関数は冗長ですが、読みやすく、高速で、正規表現を使用せず、一般的な URL の 99% を解決します (100% 確実にしたい場合は、switch ブロックを拡張して 6 つ以上のドットをサポートするだけですが、 URL にこれほど多くのドットが含まれているのを見たことがありません)。

お役に立てれば、

于 2015-05-03T20:02:02.477 に答える