2016-07-20 1 views
1

URLのドメインを取得するための非常に簡単な機能があります。返される文字列から探しているのはドメイン名だけです( 'www.example.com'ではなく 'example.com')。RegEx結果6文字と7(+)文字ドメインの違い

私はこの機能をテストしていますが、7文字以下のドメインを除いて問題はないようです。ここで

は私のサンプルの入力と出力は、次のとおりです。

IN:http://www.example.com/asdf.html - OUT:example.com

IN:http://www.1234.com/asdf - OUT IN:1234.com

http://www.exampl.com/asdf - OUT www.exampl.com

私を捨てているのは、最後の入出力です。ドメインが7文字未満のときに、なぜ関数がwww.を返すのか分かりません。

function getDomain($url = STR_EMP) { 
    preg_match("/[a-zA-Z0-9\-\_]{1,63}\.[a-z\.]{2,10}$/", parse_url($url, PHP_URL_HOST), $_domain_tld); 
    return $_domain_tld[0]; 
} 


$url1 = "http://www.example.com/asdf.html"; // example.com 
$url2 = "http://www.1234.com/asdf"; //1234.com 
$url3 = "http://www.exampl.com/asdf"; // www.exampl.com 

var_dump(getDomain($url1), getDomain($url2), getDomain($url3)); 

(出力)

string(11) "example.com" 
string(8) "1234.com" 
string(14) "www.exampl.com" 

私は正規表現とプロではないんだけど、6文字のドメインは、{1,63}の基準に適合するようだ:ここで

コードです表現の中で。誰かがwww.の6文字のwww.exampl.comドメインを返す理由を説明できますか?

もっと短いURLを防ぐためにRegExがありますか?

ありがとうございました。

UPDATE:ドメインの

基準:

some.site.com出力はsite.com

a.nother.site.comも出力site.com

+0

最初に正規表現を正しくエスケープする –

+0

期待する出力の基準は何ですか?入力が 'some.site.com'の場合、' site.com'または 'some.site.com'だけが必要ですか(' www.'だけを取り除くべきですか?) 'a.longer.one.com'はどうですか? 'one.com'をしたいですか? 'longer.one.com'? – Chris

+0

私は 'site.com'と' one.com'を望みます、ごめんなさい。 – TJB4rn3s

答えて

0

あなたの正規表現は、としてwww.exampl.comのような短いドメインと一致します。

www   [a-zA-Z0-9\-\_]{1,63} 
.   \. 
exampl.com [a-z\.]{2,10}$ 

長いドメインのみ最後の部分のように一致している[a-z\.]{2,10}の10文字の制限内に収まるwww.example.com、のような:

www   NOT MATCHED 
.   NOT MATCHED 
example  [a-zA-Z0-9\-\_]{1,63} 
.   \. 
com   [a-z\.]{2,10}$ 

正規表現はできるだけ早く一致を試みるため、可能な限りいつもwwwが含まれます。

通常は最後の2つの部分を返したいが、co.ukのような特別な場合は最後の3つを返す場合は、以下を使用することができます。しかし、これはすべての第2レベルのドメインを正規表現にリストする必要があるので、それは良い解決策ではありません。

'/[\w-]+\.(co\.uk|[a-z]+)$/' 
+0

Gotchya!私は短いドメインと一致する{2,10}基準については考えていませんでした...意味があります、ありがとうございます。 Imを答えとしてマークするつもりですが、あなたがそれを指摘しているので、この例に基づいてgetDomain関数を完全に改訂しています。https://gist.github.com/pocesar/5366899 – TJB4rn3s

2

あなたの人生をかけて、複雑にしないでください、変更する必要がありますする必要がありgetDomain

function getDomain($url = STR_EMP) { 
    $parse = parse_url($url); 
    return str_ireplace('www.', '', $parse['host']);; 
} 

出力は以下のようになります。

string(11) "example.com" 
string(8) "1234.com" 
string(10) "exampl.com" 

あなたの正規表現については、それだけではなく、長さの問題だ、それはまた、文字クラスの問題だdemo here


あなたの編集に関するアップデートは、使用することができますこのコード:

function getDomain($url = STR_EMP) { 
    preg_match("/[\\w-]{1,63}\\.[a-z]{2,10}$/", parse_url($url, PHP_URL_HOST), $_domain_tld); 
    return $_domain_tld[0]; 
} 


$url1 = "http://www.example.com/asdf.html"; 
$url2 = "http://www.1234.com/asdf"; 
$url3 = "http://www.exampl.com/asdf"; 
$url4 = "http://a.nother.site.com"; 

var_dump(getDomain($url1), getDomain($url2), getDomain($url3), getDomain($url4)); 

正規表現はTLDの最後の部分にのみ一致するようにしました。

それは生産:

string(11) "example.com" 
string(8) "1234.com" 
string(10) "exampl.com" 
string(8) "site.com" 
+0

上記の情報をいくつか追加しましたが、/asdfasdf.example.com/asdf'は 'asdfasdf.example.com'の出力を与えました。ここで' example.com'を探しています – TJB4rn3s

+0

これは正しい軌道にあるようですが、 'www.example .co.uk'は 'co.uk'を返します。私はあなたが '[az \。] {2,10}'部分から '\ .'を削除したことに気づきました。ほとんどの場合、動作します@Thomas Ayoub – TJB4rn3s

+0

@ TJB4rn3sあなたはどのように対処しますかwww.to.us' vs 'www.example.co.uk'? –

関連する問題