regex_replaceモディファイアでタグの要素名を大文字化する方法
できました!
regex_replace
モディファイアを使ってタグの要素名を大文字化する事ができました。
以前、「フォーマット「改行を変換する」でHTML4を出力する方法」という記事中でタグの要素名を大文字化する方法を紹介しましたが、どれも不完全なものでした。
しかし、今回のは違います。
regex_replace
モディファイアの使い方だけで実現可能です。
以前のとは違ってフォーマットも選んだりしません。
フォーマットが改行を変換する以外でも大丈夫です。
使用例
まずは下の使用例をご覧ください。
<$MTEntryBody regex_replace="/(<\/?[a-z0-9]+[ />])/g","\U$1\E"$>
これが一番シンプルなものになると思います。
なので要素名のチェックは緩く、要素名が全て小文字か数字であるものだけが対象になります。
えっと、数字だけの要素名にもマッチします。
XMLタグのように、記号や大文字と小文字が混在する要素名は対象外になります。
大文字と小文字が混在する要素名に関してはi修飾子を加える事で可能です。
これもチェックが緩いです。
<$MTEntryBody regex_replace="/(<\/?[a-z0-9]+[ />])/gi","\U$1\E"$>
記号も対象に加える場合は、工夫してください。
というかですね、XMLタグの要素名がどのような命名規則に基づいているのか知りません。
たぶん、こんなんでいけるんじゃないでしょうか。
例によってチェックが(以下略
<$MTEntryBody regex_replace="/(<\/?[a-z:_][a-z0-9._\-:]*[ />])/gi","\U$1\E"$>
解説
欲しい人もいないと思いますが、念のためにざっくりと説明します。
下を解説例の対象とします。
regex_replace="/(<\/?[a-z0-9]+[ />])/g","\U$1\E"
どれも大雑把な例です。
配列を使ってタグの要素名を厳密に調べる事も可能ですが、そこまでする程の価値がこの方法にあるとは……。
第一引数
まずは第一引数/(<\/?[a-z0-9]+[ />])/g
について。
最初と最後の/はregex_replace
を使う上で必須なので説明不要でしょう。
<
は後方の[ />]
とあわせて、HTMLタグのチェックをより正確にしようという、気休めです。
タグのチェックが[a-z0-9]+
と大まかなものである以上、気休めです。
[a-z0-9]+
はタグの要素名が小文字と数字のみである場合にマッチします、大雑把。
\/?
は終了タグもマッチさせるためです。
\
マークがないと/
がregex_replace
の終わりだと勘違いされる恐れがあります。
末尾のg
はPerlの正規表現で使える修飾子で、第一引数のものがマッチしなくなるまで探してくれます。
g
がない場合は一回しか探しません。
第二引数
続いての第二引数\U$1\E
。
ポイントはregex_replace
の第二引数に使ったメタ文字\U
と\E
です。
\U
は\E
までの間に挟まれた小文字を大文字に換える事ができます。
$1
は変数の参照です。
第一引数で()
に括られているものがマッチした場合に吐き出します。
後書き
今回の発見は、regex_replace
モディファイアの第二引数にメタ文字が使えると気づいた事によるものです。
私自身、これを書いている数分前まで知りませんでした。
regex_replace
の書式から第二引数にメタ文字は使えないと思い込んでいました。
変な言い訳をすれば、修飾子にe
が使えない時点で勘違いが始まっていたのだと思います。
よくよく考えれば特殊変数の参照ができるのですからメタ文字は使えて当然でした。
おまけ:HTML4化のための空要素タグを変換
タグが大文字化できるのであれば、HTML4化するために残された障害は空要素タグの書式だけだけ。
こんな障害を抱えている人は、まず、いないと思いますが。
まあ、記事冒頭でも紹介した以前の記事のリベンジです。
皆さんの予想通り、この方法も大雑把です。
<$MTEntryBody regex_replace="/(<*) *\/ *(>)/ig","$1$2"$>
か、仇をとったぞ。
コメント[0]
コメント投稿フォーム
コメントを投稿するにはJavaScirptが必要です。ブラウザのJavaScriptを有効にしてください。
トラックバック[1]
- フォーマット「改行を変換する」でHTML4を出力する方法 - 45式::雑記 (2009年5月11日04:32)
- Movable TypeでHTML4仕様のサイトを構築するためには障害があります。それはフォーマット「改行を変換する」で出力されるHTMLタグが小文字であ...
コメントはまだありません。