2012-04-28 13 views
3

ドメインのパスとして返さ:PHPパースのURL - 私は入力は次のいずれかの可能性がPHPでURLの解析しようとしていたときに、プロトコルのプレフィックス存在しない

コード:

$info = parse_url('http://www.domainname.com/'); 
print_r($info); 

$info = parse_url('www.domain.com'); 
print_r($info); 

$info = parse_url('/test/'); 
print_r($info); 

$info = parse_url('test.php'); 
print_r($info); 

を戻り値:

Array 
(
    [scheme] => http 
    [host] => www.domainname.com 
    [path] =>/
) 
Array 
(
    [path] => www.domain.com 
) 
Array 
(
    [path] => /test/ 
) 
Array 
(
    [path] => test.php 
) 

あなたが見ることができる問題は、ドメインが再される第2の例でありますパスとして回った。

答えて

6

これは、右の結果が得られますが、ファイルはスラッシュで開始する必要があります。

parse('http://www.domainname.com/'); 
parse('www.domain.com'); 
parse('/test/'); 
parse("/file.php"); 

function parse($url){ 
    if(strpos($url,"://")===false && substr($url,0,1)!="/") $url = "http://".$url; 
    $info = parse_url($url); 
    if($info) 
    print_r($info); 
} 

と結果は次のとおりです。

Array 
(
    [scheme] => http 
    [host] => www.domainname.com 
    [path] =>/
) 
Array 
(
    [scheme] => http 
    [host] => www.domain.com 
) 
Array 
(
    [path] => /test/ 
) 
Array 
(
    [path] => /file.php 
) 
+0

優秀!どうもありがとうございました! – Matt

+0

ようこそ。 –

+0

すばやく、ファイル名とドメイン名を区別して先頭のスラッシュを追加するにはどうすればよいですか? – Matt

0

は、それがあることを保持する方法でURLを処理するにはスキーマレスのURLであり、ドメインを識別できるようにするには、次のコードを使用します。

if (!preg_match('/^([a-z][a-z0-9\-\.\+]*:)|(\/)/', $url)) { 
    $url = '//' . $url; 
} 

URLが有効なスキームを持たず、 "/"で始まらない場合にのみ、URLの先頭に "//"が適用されます。

この上のいくつかの簡単な背景:

パーサは(有効な)文字の前に想定して「:」「//」ドメインで以下の文字一方で、スキーマです。 URLにスキームとドメインの両方があることを示すには、2つのマーカー "://"を連続して使用する必要があります。例えば

  • [scheme]:[path//path]
  • //[domain][/path]
  • [scheme]://[domain][/path]
  • [/path]
  • [path]

これはPHPはparse_url()でURLを解析しますが、それは標準にだ場合、私は言うことができなかった方法です。

有効なスキーム名の規則は次のとおりです。alpha *(alpha | digit | "+" | "-" | ".")

関連する問題