mx.validators.Validatorを継承して作った。
名づけて"IPValidator"。
IPv4専用。
ネットワークアドレスの有効無効、ブロードキャストアドレスの有効無効もつけてみた。
必要かどうかはよく解らないけど。
つかいかた
<eth0:IPValidator source="{ipaddr_text}" property="text" networkAddrEnable="false" broadcastAddrEnable="false" cidr="24" formatError="有効なIPではありません" networkAddrError="ネットワークアドレスは無効です" broadcastAddrError="ブロードキャストアドレスは無効です" />
IPValidator
package jp.eth0 { import mx.validators.ValidationResult; import mx.validators.Validator; public class IPValidator extends Validator { public var cidr:int = 24; public var networkAddrEnable:Boolean = true; public var broadcastAddrEnable:Boolean = true; public var formatError:String = "有効なIPではありません"; public var networkAddrError:String = "ネットワークアドレスは無効です"; public var broadcastAddrError:String = "ブロードキャストアドレスは無効です"; public function IPValidator() { super(); } override protected function doValidation(value:Object):Array { var results:Array = super.doValidation(value); if (super.required || 0<String(value).length) { // フォーマット if (IPValidator.isValidIP(String(value))) { var addr:uint = IPValidator.ip2uint(String(value)); // ネットワークアドレス if (networkAddrEnable==false && IPValidator.isNetworkAddr(addr, cidr)) { results.push(new ValidationResult(true, null, "network", networkAddrError)); } // ブロードキャストアドレス if (broadcastAddrEnable==false && IPValidator.isBroadcastAddr(addr, cidr)) { results.push(new ValidationResult(true, null, "broadcast", broadcastAddrError)); } } else { results.push(new ValidationResult(true, null, "format", formatError)); } } return results; } /* static */ // 正しいIPかチェック public static function isValidIP(ip:String):Boolean { var oct:String = "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" //0〜255 var oct4:RegExp = new RegExp("^"+oct+"\\."+oct+"\\."+oct+"\\."+oct+"$"); if (ip.match(oct4)!=null) { return true; } return false; } // Stringで渡したIPをuintにして返す public static function ip2uint(ip:String):uint { var oct:String = "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" //0〜255 var oct4:RegExp = new RegExp("^"+oct+"\\."+oct+"\\."+oct+"\\."+oct+"$"); var match:Array = ip.match(oct4); if (match!=null) { return uint((int(match[1])<<24) + (int(match[2])<<16)+ (int(match[3])<<8) + int(match[4])); } return 0; } // ネットワークアドレスかチェック public static function isNetworkAddr(addr:uint, cidr:int):Boolean { if (((Math.pow(2, 32-cidr)-1) & addr) == 0) { return true; } return false; } // ブロードキャストアドレスかチェック public static function isBroadcastAddr(addr:uint, cidr:int):Boolean { if (((Math.pow(2, 32-cidr)-1) & addr) == (Math.pow(2, 32-cidr)-1)) { return true; } return false; } } }