15.3.使用正则表达式创建国际化邮政编码Validator

15.3.1 问题
你如何去验证一些南美洲国家的邮政编号呢?
15.3.2 解决办法
对于不同的国家, 我们可以创建一系列不同的正则表达式使用群组。比如说, 我们可以创建一个自定义的Validator 类用以传递一个国家值。然后, 根据这个值, 呼叫相对应的RegExp 里的doValidation 方法。如果这个值跟RegExp 相配的话, 或者该国家本来就没有邮政编号的话, 就会返回true。否则, 就会返回false。
15.3.3 讨论
在自定义的validator 里使用正则表达式, 可以让你很方便地创建各种多功能的验证方法。如果没有它的帮助, validator 就只能为单一的字符串进行验证。同时, 通过使用多个的正则表达式, 你可很轻易地创建一个能验证复数字符串的类。

在以下的代码里, 有着一个包含着不同国家的邮政编号哈希表(hash table)。当使用者选择了所需的国家并把这个值传递给validator 后, 它就会把相对应的正则表达式就会从这个哈希表(hash table)中选出。
代码如下:
+展开
-ActionScript
private var countryHash:Object = {"Argentina":/[a-zA-Z]\d{4}[a-zAZ]{
3}/, "Brazil":/\d{5}-\d{3}/, "Mexico":/\d{5}/,
"Bolivia":/\d{4}/, "Chile":/\d{7}/, "Paraguay":/\d{4}/,
"Uruguay":/\d{5}/};

在以下的例子中, validator 的国家属性会被引用到Validator 类的doValidation 方法中:
代码如下:
+展开
-ActionScript
//用来确认country 这个值是否为空
if(countryHash[_country] != null) {
//由哈希表(hash table)中读取并取得正确的RegExp
var regEx:RegExp = countryHash[_country];
if(regEx.test(value as String)) {
return results;
else {
//如果邮编无效, 则返回一个错误
var err:ValidationResult = new ValidationResult(true"""",
"Please Enter A Correct Postal Code");
results.push(err);
}
else {
return results;
}

完整的validator 代码如下:
+展开
-ActionScript
package oreilly.cookbook
{
import mx.validators.ValidationResult;
import mx.validators.Validator;
public class SouthAmericanValidator extends Validator
{
//把所有需要的国家名跟它们的邮政编号储存在哈希表(hash table)中
private var countryHash:Object = {"Argentina":/[a-zAZ]\
d{4}[a-zA-Z]{3}/,"Brazil":/\d{5}-\d{3}/,
"Mexico":/\d{5}/, "Bolivia":/\d{4}/, "Chile":/\d{7}/,
"Paraguay":/\d{4}/, "Uruguay":/\d{5}/};
private var results:Array;
private var _country:String;
public function SouthAmericanValidator() {
super();
}
public function set country(str:String):void {
_country = str;
trace(_country);
}
//定义doValidation()方法
override protected function doValidation(value:Object):Array
{
// Clear results Array.
results = [];
//如果country这个值为空, 返回一个错误
if(_country == "") {
var err:ValidationResult = new ValidationResult(true,
"""""Please Select a Country");
results.push(err);
return results;
else {
//如果这个国家没有政编, 就不会返回任何错误
if(countryHash[_country] != null) {
//read from our hash table and get the correct RegExp
var regEx:RegExp = countryHash[_country];
if(regEx.test(value as String)) {
return results;
else {
// 如果该邮编号码不正确, 则返回一个错误
var err:ValidationResult =
new ValidationResult(true"""", "Please
Enter A Correct Postal Code");
results.push(err);
}
else {
return results;
}
}
return results;
}
}
}

如果要应用这个自定义的validator, 我们首先要确保其中包含国家的值是否就绪, 再去呼叫validator 里的doValidation 方法。在以下的例子里, 一个ComboBox 组件就被用来设置SouthAmericanValidator 里的国家的值。
代码如下:
+展开
-XML
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxmlwidth="400"
height="300xmlns:cookbook="oreilly.cookbook.*">

<cookbook:SouthAmericanValidator property="textsource="{zip}"
required="trueid="validator"
invalid="showInvalid(event)"/>

<mx:Script>
<![CDATA[
import mx.events.ValidationResultEvent;
private function
showInvalid(event:ValidationResultEvent):void
{
trace( " event " + event.message );
zip.errorString = event.message;
}

]]>
</mx:Script>
<mx:Form>
<mx:FormItem label="Select country ">
<mx:ComboBox dataProvider="{['Argentina', 'Brazil',
'Mexico', 'Bolivia', 'Ecuador', 'Colombia',
'Chile','Paraguay','Uruguay']}
"
id="cbchange="validator.country = cb.selectedItem as
String
"/>

</mx:FormItem>
<mx:FormItem label="Enter zip ">
<mx:TextInput id="zip"/>
</mx:FormItem>
</mx:Form>
</mx:HBox>

加支付宝好友偷能量挖...


评论(0)网络
阅读(148)喜欢(0)flash/flex/fcs/AIR