2

私のウェブサイトが提供するAPIと組み合わせて使用​​される検証スクリプトをPHPで作成しようとしています。アイデアは、ユーザーがAPIが機能する必要のあるすべてのドメインに入力し、競合他社が自分のサイトにコードを配置するのを防ぐことです。入力したドメインが有効な形式であることを確認したいだけです

次のドメインタイプを許可する必要があります。

  • xyz.domain.xxxx
  • * .domain.xxxx
  • domain.xxxx

私が検索したところ、見つけたコードのスニペット(1、2、3 は、すべてのドメインを最も単純な形式に縮小する傾向があり、ワイルドカードやサブドメインを考慮していないようです-または少し動作しているようです私が探しているものとは異なります。domain.com

いつの日か、RegExpressionsをマスターしたいと思っています。

前もって感謝します!

更新:ソリューション

最終的にTLDを拒否するRegExを使用しました。preg_match失敗した場合は、TLDを検証するセーフティネットとしてドメインでDNSチェックを実行します。これは人々がゴミに入るのを防ぎますMyNameIsFred

$domain = str_replace('http://', '', strtolower($_REQUEST['domain']));

//Not checking TLDs. Instead if the domain fails, we will check DNS records to see if it is a TLD or somehow otherwise exists.
/* $reg = '/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)([a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?)(?>\.(?1)){0,126}$/iD'; //TLD domains OK */

$reg = '/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?(?>\.[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?){1,126}$/iD'; //No TLD
if (preg_match($reg, $domain)!=1) {
    if (!checkdnsrr($domain.'.', 'A') && !checkdnsrr($domain.'.', 'AAAA'))
        //ERROR
}    
//SUCCESS
4

2 に答える 2

1

これにより、ドメインが検証されます(ワイルドカードを使用)

'/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)([a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?)(?>\.(?1)){1,126}$/iD'

TLDのみのドメイン(要求に応じて削除)、または単にを許可し*ます。

連続したsを許可しません*

上記が機能しない場合は、古いバージョンのPHP(および古いバージョンのPCRE)を使用している可能性があります。以下でその問題を修正する必要があります。

'/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?(?>\.[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?){1,126}$/iD'
于 2013-03-27T13:41:45.653 に答える
0

さまざまなパーツのテストはあまり必要ありませんが、一般的なパターンは非常に簡単です。

^([\w*]+\.)?([\w-]+)(\.\w+)$
于 2013-03-27T13:44:26.250 に答える