////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package mx.validators
{
import mx.events.ValidationResultEvent;
import mx.managers.ISystemManager;
import mx.managers.SystemManager;
[ResourceBundle("validators")]
/**
* The RegExpValidator class lets you use a regular expression
* to validate a field.
* You pass a regular expression to the validator using the
* expression
property, and additional flags
* to control the regular expression pattern matching
* using the flags
property.
*
*
The validation is successful if the validator can find a match * of the regular expression in the field to validate. * A validation error occurs when the validator finds no match.
* *The RegExpValidator class dispatches the valid
* and invalid
events.
* For an invalid
event, the event object is an instance
* of the ValidationResultEvent class, and it contains an Array
* of ValidationResult objects.
However, for a valid
event, the ValidationResultEvent
* object contains an Array of RegExpValidationResult objects.
* The RegExpValidationResult class is a child class of the
* ValidationResult class, and contains additional properties
* used with regular expressions, including the following:
matchedIndex
An integer that contains the starting
* index in the input String of the match.matchedString
A String that contains the substring
* of the input String that matches the regular expression.matchedSubStrings
An Array of Strings that contains
* parenthesized substring matches, if any. If no substring matches are found,
* this Array is of length 0. Use matchedSubStrings[0] to access the
* first substring match.The <mx:RegExpValidator>
tag
* inherits all of the tag attributes of its superclass,
* and adds the following tag attributes:
* <mx:RegExpValidator * expression="No default" * flags="No default" * noExpressionError="The expression is missing." * noMatchError="The field is invalid." * /> ** * @includeExample examples/RegExValidatorExample.mxml * * @see mx.validators.RegExpValidationResult * @see mx.validators.ValidationResult * @see RegExp * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class RegExpValidator extends Validator { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function RegExpValidator() { super(); } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private */ private var regExp:RegExp; /** * @private */ private var foundMatch:Boolean = false; //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- //---------------------------------- // expression //---------------------------------- /** * @private * Storage for the expression property. */ private var _expression:String; [Inspectable(category="General")] /** * The regular expression to use for validation. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get expression():String { return _expression; } /** * @private */ public function set expression(value:String):void { if (_expression != value) { _expression = value; createRegExp(); } } //---------------------------------- // flags //---------------------------------- /** * @private * Storage for the flags property. */ private var _flags:String; [Inspectable(category="General", defaultValue="null")] /** * The regular expression flags to use when matching. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get flags():String { return _flags; } /** * @private */ public function set flags(value:String):void { if (_flags != value) { _flags = value; createRegExp(); } } //-------------------------------------------------------------------------- // // Properties: Errors // //-------------------------------------------------------------------------- //---------------------------------- // noExpressionError //---------------------------------- /** * @private * Storage for the noExpressionError property. */ private var _noExpressionError:String; /** * @private */ private var noExpressionErrorOverride:String; [Inspectable(category="Errors", defaultValue="null")] /** * Error message when there is no regular expression specifed. * The default value is "The expression is missing." * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get noExpressionError():String { return _noExpressionError; } /** * @private */ public function set noExpressionError(value:String):void { noExpressionErrorOverride = value; _noExpressionError = value != null ? value : resourceManager.getString( "validators", "noExpressionError"); } //---------------------------------- // noMatchError //---------------------------------- /** * @private * Storage for the noMatchError property. */ private var _noMatchError:String; /** * @private */ private var noMatchErrorOverride:String; [Inspectable(category="Errors", defaultValue="null")] /** * Error message when there are no matches to the regular expression. * The default value is "The field is invalid." * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get noMatchError():String { return _noMatchError; } /** * @private */ public function set noMatchError(value:String):void { noMatchErrorOverride = value; _noMatchError = value != null ? value : resourceManager.getString( "validators", "noMatchError"); } //-------------------------------------------------------------------------- // // Overridden methods // //-------------------------------------------------------------------------- /** * @private */ override protected function resourcesChanged():void { super.resourcesChanged(); noExpressionError = noExpressionErrorOverride; noMatchError = noMatchErrorOverride; } /** * Override of the base class
doValidation()
method
* to validate a regular expression.
*
* You do not call this method directly; * Flex calls it as part of performing a validation. * If you create a custom Validator class, you must implement this method.
* * @param value Object to validate. * * @return For an invalid result, an Array of ValidationResult objects, * with one ValidationResult object for each field examined by the validator. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override protected function doValidation(value:Object):Array { var results:Array = super.doValidation(value); // Return if there are errors // or if the required property is set tofalse
and length is 0.
var val:String = value ? String(value) : "";
if (results.length > 0 || ((val.length == 0) && !required))
return results;
return validateRegExpression(value);
}
/**
* @private
*/
override protected function handleResults(
errorResults:Array):ValidationResultEvent
{
var result:ValidationResultEvent;
if (foundMatch)
{
result = new ValidationResultEvent(ValidationResultEvent.VALID);
result.results = errorResults;
}
else
{
result = super.handleResults(errorResults);
}
foundMatch = false;
return result;
}
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
private function createRegExp():void
{
regExp = new RegExp(_expression,_flags);
}
/**
* @private
* Performs validation on the validator
*/
private function validateRegExpression(value:Object):Array
{
var results:Array = [];
foundMatch = false;
if (regExp && _expression != "")
{
var result:Object = regExp.exec(String(value));
if (regExp.global)
{
while (result != null)
{
results.push(new RegExpValidationResult(
false, null, "", "", result[0],
result.index, result.slice(1)));
result = regExp.exec(String(value));
foundMatch = true;
}
}
else if (result != null)
{
results.push(new RegExpValidationResult(
false, null, "", "", result[0],
result.index, result.slice(1)));
foundMatch = true;
}
if (results.length == 0)
{
results.push(new ValidationResult(
true, null, "noMatch",
noMatchError));
}
}
else
{
results.push(new ValidationResult(
true, null, "noExpression",
noExpressionError));
}
return results;
}
}
}