- ベストアンサー
FLEX3: RegExpValidatorの正規表現
- Flex3のRegExpValidatorでセンセーショナルなタイトルを作成。
- 正規表現で<>, "'を検出するinvalidに設定するvalidaterを作成したい。
- いくつか試した正規表現コードを挙げている。
- みんなの回答 (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 = "あ<" validator.expression = "^(?:(?!(>|<|&|"|')).)*$"; validator.validate(expression); //ただし… expression = "あ<" 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>" + "<あ<" + "</hoge>"); validator.expression = "^[^<>\"']*$"; validator.validate(s1.toString()); }catch (e:Error) { textfield.appendText("bug "); } //============================== //気づいたこと //================================ //何故かcatchされない!?(実体参照にはセミコロンが必要なはず。) try{ var s2:XML = XML("<hoge>" + ">" + "</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 "); } } }
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
ないのかと思って#1を書いたけどこっちを使うよう修正。 http://livedocs.adobe.com/flex/3/langref/flash/xml/XMLDocument.html
お礼
わざわざ、ありがとうございます! 理解するのに時間がかかりそうなので、取り急ぎお礼まで。