//html var rtag = /<\w+(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)?(?:\s?\/)?>|<\/\w+>/g; //(x)html var rxtag = /<\w+(?::\w+)?(?:\s+\w+(?:\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)?(?:\s?\/)?>|<\/\w+(?::\w+)?>/g;
何かこんなに書かなくても良いように思う。(-_-;)
とりあえず、簡単にテスト。
var tagStr = [ "<br/>", "<br />", "<p>abc<br>abc<br>abc</p>", "<h1></h1>", '<div style="vertical-align:bottom;"><span>foo</span></div>', "<img src='http://www.example.com' alt='&'/>", "<script type='text/javascript'><" + "/script>", "<p>123ABCあいうえお</p>", "abc<span>def\t\u3000\nghi</span>jklm", "<input type='text' value='A > B' />", "<style type='text/css'>\nbody{\n\tfont-family:'メイリオ',Meiryo;\n}\n</style>", "<gd:name value='foo'/>" ]; for ( var i = 0; i < tagStr.length ; i++ ) { //bug?回避のため毎回newする。 var rgx = new RegExp(rtag); console.log( tagStr[i].match(rgx) ); }
コンソール:結果
["<br/>"] ["<br />"] ["<p>", "<br>", "<br>", "</p>"] ["<h1>", "</h1>"] ["<div style="vertical-align:bottom;">", "<span>", "</span>", "</div>"] ["<img src='http://www.example.com' alt='&'/>"] ["<script type='text/javascript'>", "</script>"] ["<p>", "</p>"] ["<span>", "</span>"] ["<input type='text' value='A > B' />"] ["<style type='text/css'>", "</style>"] ["<gd:name value='foo'/>"] //(x)html最後のタグ文字列だけは
(x)html
バージョンの正規表現にのみマッチします。もうちょっと簡単にする
//html var rtag = /<\w+(?:\s+[^>]+)?\/?>|<\/\w+>/g; //(x)html var rxtag = /<\w+(?::\w+)?(?:\s+[^>]+)?\/?>|<\/\w+(?::\w+)?>/g;HTMLに
">"
と書かずに">"
とか書いてもちゃんと表示されちゃうワケだが、この簡易版の正規表現では許容できない。というか、それを許すようなパターンを書こうとすると私ごときでは上記のようにパターンが長くなりすぎる。
なので、7行目の結果はこうなる。
["<input type='text' value='A >"]が、これはそうなることが予想されていることなのでヨシとする。
まあ、ちゃんと
">"
と書けよ、と。とりあえずこれでOK?
jQueryにこんなのがあった。
// Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/これはシングルタグにマッチさせるパターンなのだが
"\1"
とか使ってなかなか秀逸とか思ったが、これが"<p>"
なんかにもマッチしちゃうので、使い方を工夫しないとこのままでは使えない。
0 Comments:
コメントを投稿