146

ドメイン名を検証する必要があります:

Google COM

stackoverflow.com

したがって、最も生の形式のドメイン-wwwのようなサブドメインでさえありません。

  1. 文字はaz |のみである必要があります AZ | 0-9およびピリオド(。)およびダッシュ(-)
  2. ドメイン名の部分はダッシュ(-)で開始または終了しないでください(例:-google-.com)
  3. ドメイン名の部分は1〜63文字の長さである必要があります
  4. 拡張子(TLD)は、今のところ#1のルールの下で何でもかまいません。後でリストに対して検証する可能性がありますが、1文字以上である必要があります。

編集:TLDは現状では明らかに2〜6文字です

番号。4改訂: TLDは、.co.ukのようなものを含む必要があるため、実際には「サブドメイン」とラベル付けする必要があります。可能な唯一の検証は、最初のドットの後に1つまたはルール#1の下でより多くの文字

どうもありがとう、私が試したと信じてください!

4

23 に答える 23

106

これは少し古い投稿であることは知っていますが、ここでの正規表現にはすべて、IDNドメイン名のサポートという非常に重要なコンポーネントが1つ欠けています。

IDNドメイン名はxn--で始まります。ドメイン名で拡張UTF-8文字を有効にします。たとえば、「♡.com」が有効なドメイン名であることをご存知ですか?ええ、「ラブハートドットコム」!ドメイン名を検証するには、http: //xn--c6h.com/に検証に合格させる必要があります。

この正規表現を使用するには、ドメインを小文字に変換する必要があります。また、IDNライブラリを使用して、ドメイン名をACEに確実にエンコードする必要があります(「ASCII互換エンコード」とも呼ばれます)。優れたライブラリの1つはGNU-Libidnです。

idn(1)は、国際化ドメイン名ライブラリへのコマンドラインインターフェイスです。次の例では、UTF-8のホスト名をACEエンコーディングに変換します。結果のURLhttps://nic.xn--flw351e/は、ACEでエンコードされたhttps://nic.谷歌/に相当するものとして使用できます。

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

この魔法の正規表現は、ほとんどのドメインをカバーする必要があります(ただし、見逃した有効なエッジケースはたくさんあると思います)。

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

ドメイン検証正規表現を選択するときは、ドメインが以下に一致するかどうかを確認する必要があります。

  1. xn--stackoverflow.com
  2. stackoverflow.xn--com
  3. stackoverflow.co.uk

これらの3つのドメインが合格しない場合、正規表現は正当なドメインを許可していない可能性があります。

詳細については、 『Oracle's International Language Environment Guide』の「InternationalizedDomainNamesSupport」ページを参照してください。

ここで正規表現を試してみてください:http://www.regexr.com/3abjr

ICANNは、 IDNドメインのいくつかの例を表示するために使用できる、委任されたtldのリストを保持しています。


編集:

 ^(((?!\-))(xn\-\-)?[a-z0-9\-_]{0,61}[a-z0-9]{1,1}\.)*(xn\-\-)?([a-z0-9\-]{1,61}|[a-z0-9\-]{1,30})\.[a-z]{2,}$

この正規表現は、ホスト名の末尾に「-」が付いているドメインを、有効としてマークされているものとして停止します。さらに、無制限のサブドメインを許可します。

于 2014-11-18T06:08:55.783 に答える
63

ええと、あなたの特定の要件を考えると、それは見た目よりも少しこっそりです(コメントを参照)

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

ただし、これにより多くの有効なドメインが拒否されることに注意してください。

于 2012-04-24T22:07:55.363 に答える
51

私の正規表現は次です:

^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$

i.oh1.meでもwow.british-library.ukでも大丈夫です

UPD

ここに更新されたルールがあります

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

正規表現の視覚化

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

これで、ドメインラベルの開始または終了を-チェックします。_

于 2013-11-18T11:45:24.707 に答える
31

私の賭け:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

説明:

ドメイン名はセグメントから作成されます。これが1つのセグメントです(最終を除く):

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

1〜63文字で、「-」で開始または終了することはできません。

ここで「。」を追加します それに少なくとも1回繰り返します:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

次に、2〜63文字の長さの最後のセグメントを添付します。

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

ここでテストしてください:http: //regexr.com/3au3g

于 2015-05-02T21:50:53.983 に答える
18

この回答は、ホスト名(電子メールのホスト名など)ではなく、ドメイン名(サービスRRを含む)に対するものです。

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

それは基本的にmkyongの答えであり、さらに:

  • 長さプレフィックスとヌルルートを含む255オクテットの最大長。
  • 末尾の「。」を許可します 明示的なDNSルートの場合。
  • サービスドメインRRに先頭の「_」を許可します(バグ:_ラベルに最大15文字を強制せず、サービスRRの上に少なくとも1つのドメインを必要としません)
  • 可能なすべてのTLDに一致します。
  • サブドメインラベルをキャプチャしません。

パーツ別

先読み、オプションの末尾のリテラル「。」を使用して、最大長を^$から253文字に制限します。

(?=.{1,253}\.?$)

先読み、次の文字は「-」ではなく、次の「。」の前の文字の後に「_」はありません。つまり、ラベルの最初の文字が「-」ではなく、最初の文字だけが「_」である可能性があることを強制します。

(?!-|[^.]+_)

ラベルごとに許可される文字の1〜63文字。

[A-Za-z0-9-_]{1,63}

後ろを振り返り、前の文字は「-」ではありません。つまり、ラベルの最後の文字が「-」ではないことを強制します。

(?<!-)

'。'を強制します オプションの最後を除くすべてのラベルの最後。

(?:\.|$)

ほとんど上から組み合わせると、これには少なくとも2つのドメインレベルが必要です。これは完全には正しくありませんが、通常は妥当な仮定です。TLDまたは修飾されていない相対サブドメインを許可する場合は{2、}から+に変更します(例:localhost、myrouter、to。)

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

この式の単体テスト。

于 2016-12-16T23:16:07.927 に答える
15

受け入れられた答えが私のために機能していません、これを試してください:

^((?!-)[A-Za-z0-9-] {1,63}(?<!-)\。)+ [A-Za-z] {2,6} $

検証については、このユニットテストケースにアクセスしてください。

于 2014-09-08T04:33:57.013 に答える
14

ちょっとした修正-最後の部分は最大6にする必要があります。したがって、

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

最長のTLDはmuseum(6文字)-http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

于 2013-06-04T15:45:05.707 に答える
9
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[ドメイン-小文字と0-9のみ][ハイフンを使用できます]+[TLD-小文字のみ、2〜7文字の長さである必要があります]
http://rubular.com/は、正規表現のテストに最適です。
編集:Dan Caddiganが指摘したように、「。rentals」のTLDの最大値を7文字に更新しました。

于 2013-05-23T13:27:49.660 に答える
8

他の回答でドメイン名検証ソリューションの正しい方向を示していただきありがとうございます。ドメイン名はさまざまな方法で検証できます。

IDNドメインを人間が読める形式で検証する必要がある場合は、正規表現\p{L}が役立ちます。これにより、任意の言語の任意の文字に一致させることができます。

最後の部分にもハイフンが含まれている可能性があることに注意してください。punycodeでエンコードされた中国の名前は、tldにUnicode文字を含む場合があります。

私は例えば一致する解決策に来ました:

  • Google COM
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国互联ر络信息中心。中国
  • xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

正規表現は次のとおりです。

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

ここで確認して調整します

注:現在のドメイン名で許可されている文字セットと同様に、この正規表現は非常に寛容です。

更新a-aA-Z\p{L}:ちょうど同じように、さらに単純化された\p{L}

注2:唯一の問題は、。のように、二重ドットが含まれるドメインと一致することですmasełk..owski.pl。誰かがこれを修正する方法を知っているなら、改善してください。

于 2016-07-20T09:46:09.793 に答える
5

コメントするにはまだ十分な担当者がいません。パカの解決策に応えて、私は3つの項目を調整する必要があることに気づきました。

  • ダッシュが範囲として解釈されるため、ダッシュとアンダースコアが移動されました(「0-9」のように)
  • 多くのサブドメインを持つドメイン名の終止符を追加しました
  • TLDの潜在的な長さを13に拡張しました

前:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

後:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$
于 2014-07-03T11:41:14.183 に答える
5

すでに指摘したように、実用的な意味でサブドメイン(.co.ukドメインなど)を伝えることは明らかではありません。この正規表現を使用して、実際に発生するドメインを検証します。それは私が知っているすべての実際のユースケースをカバーしています。新しいものは大歓迎です。私たちのガイドラインによると、それは非キャプチャグループと貪欲なマッチングを回避します。

^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$

証明、説明、例:https ://regex101.com/r/FLA9Bv/9 (注:正規表現はECMA2018でのみサポートされているルックビハインドを使用しているため、現在Chromeでのみ機能します

ドメインを検証するときに選択するアプローチは2つあります。

書籍ごとのFQDNマッチング(理論上の定義、実際にはめったに発生しません):

実用的/保守的なFQDNマッチング(実用的な定義、実際に期待およびサポートされている):

  • 以下の例外/追加と一致する本による
  • 有効な文字:[a-zA-Z0-9.-]
  • ラベルはハイフンで開始または終了できません(RFC-952およびRFC-1123 / 2.1による)
  • TLDの最小の長さは2文字で、現在の既存のレコードによると最大の長さは24文字です。
  • 末尾のドットと一致しない
于 2019-07-21T00:06:41.363 に答える
3

新しいgTLDの場合

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu
于 2016-03-11T09:14:17.030 に答える
2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$
于 2012-04-24T22:10:36.490 に答える
2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

私の答えの根拠をありがとう@mkyong。より長く受け入れられるラベルをサポートするように変更しました。

また、「localhost」は技術的には有効なドメイン名です。国際化ドメイン名に対応するために、この回答を変更します。

于 2015-08-05T02:54:33.837 に答える
2

例を含む完全なコードは次のとおりです。

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false
于 2017-06-27T12:05:33.497 に答える
1

^ [a-zA-Z0-9] [-a-zA-Z0-9] +[a-zA-Z0-9]。[az]{2,3}(。[az] {2,3}) ?(。[az] {2,3})?$

動作する例:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

拡張機能にも使用できます

.com.uk
.co.in
.uk.edu.in

動作しない例:

-stack.com

最長のドメイン拡張子でも機能します".versicherung"

于 2015-06-12T13:43:13.243 に答える
0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2})->2文字のみを受け入れる場合。

  • ([0-9]{1,2})->2つの番号のみを受け入れる場合

2を超えるものがある場合は、([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])この正規表現がそれを処理します。

マッチングを少なくとも1回行いたい場合は、を+使用します。

于 2015-04-02T10:34:33.380 に答える
0
  • ^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$

яндекс.рфエンコード後などのドメインを検証します。

https://regex101.com/r/Hf8wFM/1-サンドボックス

于 2019-12-10T13:06:23.940 に答える
0

次の正規表現は、特定のドメインのサブ、ルート、およびTLDを抽出します。

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

次のドメインでテスト済み:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk
于 2019-12-30T20:14:12.723 に答える
0

プロトコルと一緒にドメインを簡単にフェッチするために、以下を実行しました。例: https ://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M

以下の正規表現パターンを使用してください:[a-zA-Z0-9] +://.*?/

出力が表示されます: https ://www.facebook.com/ ftp://192.282.34.337/

于 2020-07-25T07:56:34.210 に答える
0

非常にシンプルで、非常に寛容です。-notvalid.at-allのような誤検知が発生しますが、誤検知は発生しません。

/^([0-9a-z-]+\.?)+$/i

ドットで終わる可能性のある文字番号とダッシュのシーケンスがあり、それに続いて、これらの種類のシーケンスがいくつでもあることを確認します。

この正規表現について私が気に入っているのは、短く(おそらくここで最も短い)、簡単に理解でき、クライアント側でユーザー入力エラーを検証するのに十分なことです。

于 2020-11-03T02:27:48.427 に答える
0

Javascriptの場合、バリデーターライブラリを調べることができます: https ://www.npmjs.com/package/validator

方法:isFQDN(str [, options])

于 2021-03-03T11:49:48.830 に答える
0

ドメインの各部分が63文字以下であるかどうかを確認し、punycode表記を使用して国際化ドメイン名を許可します。

\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b
于 2022-01-08T07:31:41.107 に答える