掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ipアドレスが正しいかどうかを判定するには? (ID:29200)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんにちは。 私も、isSafeIPを作ってみました。 function isSafeIP(IP:String):Boolean; var i, Val: Integer; begin Result := False; with TWordDecompose.Create('.', IP, dmDelimiterExactly) do try //↓分割要素数が厳密に4であること if Count <> 4 then Exit; for i := 0 to 3 do begin //↓要素が空文字じゃないこと if Words[i] = '' then Exit; //↓要素が数字(0〜9)で出来ていること if CheckStrInTable(Words[i], hanNumberTbl) <> itAllInclude then Exit; //↓2文字以上あって先頭が0じゃないこと if (2 <= Length(Words[i])) and (AnsiPos('0', Words[i])=1) then Exit; //↓StrToIntで数値変換できること if not TryStrToInt(Words[i], Val) then Exit; //↓範囲が0〜255であること if not CheckRange(0, Val, 255) then Exit end; Result := True; finally Free; end; end; TWordDecomposeは、文字列を区分するクラス、Split関数みたいなもの CheckStrInTableは文字列がテーブルに含まれているかどうか判断する関数 CheckRangeは範囲を調べる関数 DelFusa Library - Delphi OpenSource - DelFusa Floor http://delfusa.main.jp/delfusafloor/opensource/delfusa_library_f.html 以下、次のようなテストコード通過してます。 procedure TForm1.Button1Click(Sender: TObject); begin Check(True, isSafeIP('0.0.0.0')); Check(True, isSafeIP('1.2.3.4')); Check(True, isSafeIP('255.255.255.0')); Check(True, isSafeIP('255.255.0.0')); Check(True, isSafeIP('0.0.0.255')); Check(True, isSafeIP('192.168.0.1')); Check(False, isSafeIP('192.168.0.-1')); // 数字の桁が3桁より多い Check(False, isSafeIP('0192.168.0.1')); Check(False, isSafeIP('192.168.0000.1')); Check(False, isSafeIP('192.168.0.0001')); Check(False, isSafeIP('0001.0012.0123.000255')); //桁が余分※仕様によって変更あり Check(False, isSafeIP('192.168.0.01')); Check(False, isSafeIP('192.02.03.04')); Check(False, isSafeIP('0192.02.03.04')); Check(False, isSafeIP('01.02.03.04')); // 数字の数が4個より多い Check(False, isSafeIP('12.34.56.78.90')); Check(False, isSafeIP('12.34.56.78.90.123')); // 末尾に余計なドット Check(False, isSafeIP('124.083.147.202..')); Check(False, isSafeIP('124.083.147.202...')); //先頭に余計なドット Check(False, isSafeIP('.124.083.147.202')); //数値がない部分がある Check(False, isSafeIP('.0.0.1')); Check(False, isSafeIP('0.0..1')); //数値が範囲外 Check(False, isSafeIP('256.255.255.0')); Check(False, isSafeIP('255.255.0.256')); //数値じゃない値が入っている Check(False, isSafeIP('0.0F.0.255')); Check(False, isSafeIP('0.0x0F.0.255')); Check(False, isSafeIP('0.$0F.0.255')); end; 作ってみると みなさんの実装、参考になりますね。 StrToIntを実行してから、 IntToStrを実行して同じかどうか見るってのは 先頭文字がゼロとか、全部の文字が0〜9になっているとかを 判断する必要がなくなるので わかりやすい整合性チェックできますね。 リファクタリング、 つまり、関数の定義は変えずに内部実装をもっと効率よくわかりやすく 工夫してみました。 下記でもテストコードを通過しています。 function isSafeIP(IP:String):Boolean; var i, Val: Integer; begin Result := False; with TWordDecompose.Create('.', IP, dmDelimiterExactly) do try if Count <> 4 then Exit; for i := 0 to 3 do begin if Words[i] = '' then Exit; if not TryStrToInt(Words[i], Val) then Exit; if not (Val in [0..255]) then Exit; if not (Words[i]=IntToStr(Val)) then Exit; end; Result := True; finally Free; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.