Page Top

Movable Type(MT)アイテム画像の「高さ」を抽出する方法

October 13, 2014

Movable Typeでアイテム画像の「高さ」を抽出する方法には2通りあります(それ以上あるかもしれませんが、今のところ知っているのは2通りなので2通りにしておきたいと思います。)

1つはMTタグである「MTAssetProperty」を用い、そのモディファイアとして「image_height」を指定して「高さ」を抽出する方法。(以下、<>は全角にしています。)

<MTAssets>
<$MTAssetProperty property="image_height"$>
</MTAssets>

2つ目は、「MTAssetThumbnailLink」を用いて、グローバルモディファイアの「sanitize」 と正規表現を用いて「高さ」を抽出する方法です。(以下、<>は全角にしています。)

<MTAssets>
<$MTAssetThumbnailLink sanitize="img height" regex_replace='/(.*?height=")(.*?)(".*)/g','$2' strip_linefeeds="1" trim="1"$>
</MTAssets>

通常であれば、1つ目の方法でいとも簡単に「高さ」を取得する事ができるので、2番目の方法は必要ないと思うのですが、、ひょんなことから、このような方法を取ってしまった為に、少し苦悩しましたので・・、ここに書き記して置きたいなと思いました。

2つ目の方法での正規表現は、「かたつむりくんのWWW」様の記事「ブログ記事本文中の最初のimgのURLを取得する」を参考にさせていただきました。ありがとうございます!

この正規表現、やはり勉強して理解しないことには、と思い、自分なりにネットで初歩を学びました。その初歩なりの理解で、となりますが、この正規表現の意味するところを解釈してみたいと思います。

まず、MTにおけるグローバルモディファイアの「regex_replace」の役割をここでおさらいします。movabletype.jpの「regex_replace」より引用。(以下、<>は全角にしています。)

<引用開始>
--------------------------------------------------
regex_replace

/pattern_foo/ と replacement_foo を設定することで、Movable Type タグの値の正規表現による置換が行えます。例えば Movable Type タグの値に含まれる foo を bar に置換したい場合は以下のように書きます。

<mt:entrybody regex_replace="/foo/","bar">

使い方

<mt:entrybody regex_replace="/foo/","bar">
--------------------------------------------------
<引用終了>

とあるように、「regex_replace」を使って、「/foo/」というパターンを「bar」にすることが出来ます。ちなみに「foo」は、「//」で挟んで使用します。(←これは、Perlのパターンマッチ演算子というものの書き方のようです。)

そして、この「//」の中に来る正規表現が、以下となります。
--------------------------------------------------
(.*?height=")(.*?)(".*)
--------------------------------------------------

まず、「()」で3箇所、グループ化されています。「(.*?height=")」と「(.*?)」と「(".*)」です。このメタ文字「()」は、「グループ化」という正規表現上の意味があるようです。(参考URL:「Perl基礎入門」様の「第7章 正規表現」)

そして、上記サイト様の「第7章 正規表現」より引用させていただきますと、このグループ化させるメタ文字「()」を使用して、

<引用開始>
--------------------------------------------------
「複数の文字列をまとめた形でパターンマッチを行います。
またこのパターングループでマッチした文字列は、特殊変数 ( $ + 数字 ) に、マッチした順に代入することができます。( ex. $1, $2, $3, ... ) 」
--------------------------------------------------
<引用終了>

と、あります。つまり、
--------------------------------------------------
regex_replace='/(.*?height=")(.*?)(".*)/g','$2'
--------------------------------------------------
の意味するところは、大まかに言うと、「//」で囲まれた、3つにグループ化された文字列のパターンの2番目「$2」、つまり、高さの数字のみの部分「(.*?)」が、グループ化された文字の2番目が代入される変数「$2」に代入され、置き換えられる、ということになります。

ここで気になる「//」の後ろにある「g」ですが、これは、先ほどの「第7章 正規表現」によりますと、「置換演算子には、置換えを行う際のオプションとして、修飾子が用意されており、「g」には、繰り返しマッチする (global)」の意味があるようです。ですので、1度だけ出現するheightの値だけでなく、2度目、3度目、と、繰り返し出現するheightの値もチェックする、という意味になります。

「//」の中の正規表現の中身をもっと詳しく見て行きますと、「(.*?height=")」の中の「.*」は、「何でも良い1文字が全く無いか、連続するか」の意で、その後ろの「?」は、「直前の文字が全く無いか1つだけある」という意味になります。

大局して大雑把に言ってしまうと、以下の意味は、
--------------------------------------------------
<$MTAssetThumbnailLink sanitize="img height" regex_replace='/(.*?height=")(.*?)(".*)/g','$2' strip_linefeeds="1" trim="1"$>
--------------------------------------------------
「MTAssetThumbnailLink」でアイテム画像のXHTML タグを出力し、それを「sanitize」することで、「img」という要素とその属性の「height」だけを抽出し、そのうち、「regex_replace」で、実際の値が「height="700"」などであれば、その中の「700」だけを取得する、ということになります。

最後、説明がちょっと力尽きてしまいましたが、、こんな感じです。1つ目の方法が簡単なので、そちらを使用するのが良いと思います。場合によっては2番目の方法も、カスタマイズなどして使うケースもあるかもしれませんので、このような方法もあるのだと頭の片隅に覚えておくのも良いかもしれません。

最新記事