電子書籍の厳選無料作品が豊富!

はじめまして。flex3のRegExpValidatorで、
<>"'
を検出するとinvalidとするvalidaterを作成したいのですが
正規表現でつまずいています。どなたか、お知恵をお貸し下さい・・・。
なお、普通に>や<をexpressionに含めると動作しないのでエンティティを使いました。
下にいくつか試したコードを列記します。宜しくお願いします。

expression="[^&lt;&gt;&apos;&quot;]+"
//invalidを検出せず
expression=".[&lt;&gt;&apos;&quot;]"
//真逆の動作、つまりこれらの記号を含まない場合にinvalidとなる

A 回答 (2件)

package


{
import flash.display.Sprite;
import flash.events.Event;
import mx.validators.RegExpValidator;
import mx.events.ValidationResultEvent;
import flash.text.TextField;

/**
* ...
* @author himajin100000
*/
public class Main extends Sprite
{
private var textfield:flash.text.TextField;

public function Main():void
{

textfield = new flash.text.TextField();
textfield.width = 5000;
this.addChild(textfield);

var expression:String = "あ<い";
var validator:mx.validators.RegExpValidator;
validator = new mx.validators.RegExpValidator();
validator.expression = "^[^<>\"']*$";
validator.addEventListener("valid", this.validated);
validator.addEventListener("invalid", this.invalidated);
validator.validate(expression);

//質問文でやりたがっていると思われること。ここから。(個人的に非推奨)
//http://www.revulo.com/blog/20080415.htmlを参考にしました。

expression = "あ&lt;"
validator.expression = "^(?:(?!(&gt;|&lt;|&amp;|&quot;|&apos;)).)*$";
validator.validate(expression);

//ただし…

expression = "あ&#x3C;"
validator.validate(expression);

expression = "あ<"
validator.validate(expression);


//の二つはvalidにしてある。(面倒くさいだけ)


//=====================================

//ここまでは伏線。ここから本題。

//=====================================

// たぶんHTMLやXMLにかかわるコードだと思うんだけど,
// validateとescapeは明確に異なり
// http://d.hatena.ne.jp/gallu/20081112/p1
// validateは先に,escapeは後に行うべき。

// > なお、普通に>や<をexpressionに含めると動作しないのでエンティティを使いました。
// というようなものが求められてしまうのは,「設計自体がおかしい」からであって,
// その部分を設計したコーダーを罵ってでも,その部分の変更させるべきである。

// その上で,俺はXMLを使う。
// http://livedocs.adobe.com/flex/3/langref/XML.html

//=============================
//おまけ(個人的に非推奨。escapeされた状態をプログラムから扱わなくて良い手を考えるべき。
//それとは別に<!-- -->とか注釈宣言があったりするかもしれないし…)
//===============================
try {
var s1:XML = XML("<hoge>" + "&lt;あ&#x3C;" + "</hoge>");
validator.expression = "^[^<>\"']*$";
validator.validate(s1.toString());

}catch (e:Error) {
textfield.appendText("bug ");
}

//==============================
//気づいたこと
//================================
//何故かcatchされない!?(実体参照にはセミコロンが必要なはず。)
try{
var s2:XML = XML("<hoge>" + "&gt" + "</hoge>");
}catch (e:Error) {
textfield.appendText("bug ");
}

}
public function validated(e:mx.events.ValidationResultEvent ):void {
textfield.appendText("valid ");
}
public function invalidated(e:mx.events.ValidationResultEvent ):void{
textfield.appendText("invalid ");
}

}

}
    • good
    • 0
この回答へのお礼

わざわざ、ありがとうございます!
理解するのに時間がかかりそうなので、取り急ぎお礼まで。

お礼日時:2009/04/07 18:02

ないのかと思って#1を書いたけどこっちを使うよう修正。


http://livedocs.adobe.com/flex/3/langref/flash/x …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!