FlexでIPアドレスをValidateするコンポーネントを作ってみた

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;
		}
	}
}