文字列がIPアドレスの形式になっているかどうか
|
26 |
CheckTextIPAddress |
動作確認 |
Delphi2007 |
更新日 |
2008/01/15(火) |
文字列がIPアドレスとして正しい形になっているかどうかを
判断する関数を作りました。
テストコードがあるので仕様がわかります。
────────────────────
function isSafeIP(IP:String):Boolean;
var
i, Val: Integer;
begin
Result := False;
with TStringList.Create do try
Delimiter := '.';
DelimitedText := IP;
if Count <> 4 then Exit;
for i := 0 to 3 do
begin
if Strings[i] = '' then Exit;
if not TryStrToInt(Strings[i], Val) then Exit;
if not (Val in [0..255]) then Exit;
if not (Strings[i]=IntToStr(Val)) then Exit;
end;
Result := True;
finally Free; end;
end;
procedure Check(A, B: Boolean);
begin
if not(A = B) then
begin
Assert(False,
'エラーです:A=' + BoolToStr(A) + ':B=' + BoolToStr(B));
end;
end;
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.00.2.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.83.147.202.'));
Check(False, isSafeIP('124.83.147.202..'));
Check(False, isSafeIP('124.83.147.202...'));
//先頭に余計なドット
Check(False, isSafeIP('.124.83.147.202'));
//数値がない部分がある
Check(False, isSafeIP('.0.0.1'));
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;
────────────────────
数値文字列が自然かどうかを判断するには
if s = IntToStr(StrToInt(s)) then
を判断するとよいでしょう。
つまり数値にしたい文字列が、
先頭に0がついていたり、$FFだったりするのは自然っぽくないので
適切ではない、としてはじく事ができます。
参考────────────────────
ipアドレスが正しいかどうかを判定するには?
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200801/08010007.txt
|