validationのmask その2
maskを使った正規表現チェックをする際,
具体的な例を挙げると,入力された文字列が,Windowsのファイル名に使用できるかどうかをチェックしたい時とかで,
Windowsのファイル名としては<>.?/\が使えない(らしい)から,
^[<>.?/\]*$
なんて正規表現のチェックになる.(たぶん)
さて,この中で,?やら/は正規表現の特殊文字に該当するので,\でエスケープしてやる.
じゃあ
^[<>\.\?\\]*$
を,validation.xmlに記載すると,今度は<と>がxmlのパースエラーになってしまう.
2006/09/06 11:49:34 org.apache.commons.digester.Digester fatalError
致命的: Parse Fatal Error at line 94 column 27: The content of elements must consist of well-formed character data or markup.
org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1591)
at org.apache.commons.validator.ValidatorResources.(ValidatorResources.java:159)
at org.apache.struts.validator.ValidatorPlugIn.initResources(ValidatorPlugIn.java:237)
at org.apache.struts.validator.ValidatorPlugIn.init(ValidatorPlugIn.java:162)
(長いので中略)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
てなわけで,<と>については,HTMLのエスケープ記法を用いさらに,\でエスケープする.
<var>
mask
^[^\<\>\.\?\/\\]*$
</var>
という感じ.
正規表現のエスケープと,XML(HTML)のエスケープが混在するので,えらい見にくい気がするけどしょうがないのかな.
※なんかバックスラッシュが¥と表示されたり,\と表示されたりしてるので,適宜読み替えてください.