パターンにマッチした文字列を処理する MovableType プラグイン:RegexFor

Posted by
ぴろり
Posted at
2014/08/19 19:41
Trackbacks
関連記事 (0)
Comments
コメント (5)
Post Comment
コメントできます
Category
プラグイン カテゴリ
カバーイメージ

 Movable Type ユーザーコミュニティであった、本文から目次を生成できないか?という質問がきっかけです。正規表現の global match でマッチした文字列について、テンプレートタグでゴニョゴニョできれば便利かも? と思って作ってみました。

このエントリーをはてなブックマークに追加  

機能

  • 正規表現にマッチした文字列について、処理を行うブロックタグを提供します
  • 正規表現にマッチした文字列について、置換を行うブロックタグを提供します

ブログ記事から目次を生成する例

 記事本文の HTML から、JavaScript を利用してクライアント サイドで目次を生成することも可能ですが、Google など一部の検索エンジンでは、検索結果にページ内の目次セクションのレベルでリンクやスニペットを表示してくれるものがあります*1。そのため、サーバ サイドで目次を生成しておく方が、SEO の観点からも好ましいと思われます。
 次の例は、ブログ記事の追記フィールドの内容から、<h2> タグでマークアップされたヘッダを目次として抽出・整形・表示します。

<ol><mt:RegexFor tag="mt:EntryMore" regex="<h2.*?>(.+?)</h2>">
    <li><mt:var name="__$1__"></li>
</mt:RegexFor></ol>

複雑な文字列置換

 単純な文字列置換であれば regex_replace モディファイアを使えばよいのですが、置換する文字列をマッチした内容に応じて条件分岐などの制御構文で切り替えるなど、複雑な処理を書けるようにします*2

<mt:SetVar name="string" value="The quick brown fox jumps over the lazy dog.">
<mt:RegexReplace name="string" regex="(\w+ (fox|dog))">
    crazy
<mt:if name="__$2__" eq="dog">
    cat
<mt:else>
    <mt:var name="__$2__">
</mt:if>
</mt:RegexReplace>

 mt:RegexFormt:RegexReplace の動作はほとんど同じに見えます。大きな違いは、テンプレート タグの出力として、mt:RegexFor はパターン マッチした部分を取り出して、マッチしなかった部分は捨てられますmt:RegexReplace ではパターン マッチした部分を取り出して処理しつつ、マッチしなかった部分はそのまま出力されるという点です。

ダウンロード

インストール

 plugins フォルダに配置してください。データベースのアップグレード工程はありません。

プラグイン設定

 プラグインに関する設定はありません。

ライセンス等、いろいろ

  • MTOS5.13、MTOS5.2、MTOS6.0 で動作確認しています
  • ライセンスは LGPL とします*3
  • 商用目的または法人利用については 1 つの MovableType につき 1 ライセンスの購入をお願いしております。
    ライセンス料金: ¥1,000 JPY (税込み) 
    一言どうぞ:
  • 商用目的でない個人利用(アフィリエイトを含む)については無償でご利用頂けますが、よろしければ継続開発のためのライセンス購入(任意)をお願いしております。
    お気持ち:  
    一言どうぞ:
このエントリーをはてなブックマークに追加  

  1. *1 Google の検索結果では、スニペットにページ内のサブセクションへのリンクが表示される
  2. *2 正規表現だけでも実現できるのですが、遣い慣れた MTML で記述できるメリットがあるハズです
  3. *3 MovableType および MTOS で利用できます。

更新履歴

Updated at
2014/10/06 10:15
更新メモ
r32 v0.10.386 を公開しました(不具合修正 1 件)

この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:RegexFor プラグインを利用してブログ記事の目次を生成する方法

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

寄せられたコメント (全 5 件中、最新 5 件まで表示しています)

Posted by
ぴろり ◆OLEEi.VOX.ぴろり ◆OLEEi.VOX.
at
2014/10/30 19:53
ID
56XX94Zk
RegexFor プラグインでリンク付きの目次を生成するには、テンプレートに工夫が必要です。解説記事をアップしましたので参照ください。
http://www.magicvox.net/archive/2014/10301938/
Posted by
森田慶子森田慶子
at
2014/10/30 01:49
ID
TvJ4uC3k
確か最初はうまく行っていたと思っていたのですが…
気づいたら、目次は表示されていますが、リンクが張られていません。どこかいじってしまったのか…と思いつつ、該当する点を見つけられずにいます。
Posted by
森田慶子森田慶子
at
2014/10/12 01:12
ID
1cPUbYYo
ありがとうございました。修正版をダウンロードしました。
<mt:If tag="mt:EntryMore">~</mt:If> で「続き」なしの短い記事には目次なし、長い記事には目次あり…もできました。
http://careerup.biz/fashion/brand/crocs/colorlite.html
Posted by
ぴろり ◆OLEEi.VOX.ぴろり ◆OLEEi.VOX.
at
2014/10/06 10:11
ID
556tnz/Q
確認できました。mt:EntryMore に何も記入されていないと発生するようです。
<mt:If tag="mt:EntryMore">~</mt:If> で、何か入力されているか確認した上で呼び出して頂ければ回避できますが、半分プラグイン側の手落ちでもおりますので修正いたしました。
v0.10.386 修正版を公開いたしましたのでご利用ください。お手数をおかけします。
http://lab.magicvox.net/trac/mt-plugins/changeset/390
Posted by
森田慶子森田慶子
at
2014/10/03 18:38
ID
.yQ7htzg
試してみたのですが、エラーが出ました。
MT5.2.10のMTのpluginフォルダに、RegexForフォルダ配下のtagsフォルダ配下のv0.10フォルダ配下のpluginsフォルダ配下のRegexForフォルダをアップロードしました。
テンプレートのブログ記事の<$mt:EntryBody$>と<$mt:EntryMore$>の間に以下を書きました。
---------------------------------------------------------------------------------------------
<ol><mt:RegexFor tag="mt:EntryMore" regex="<h3.*?>(.+?)</h3>">
    <li><mt:var name="__$1__"></li>
</mt:RegexFor></ol>
---------------------------------------------------------------------------------------------
保存と再構築を行ったところ、以下のエラーが出ました。
---------------------------------------------------------------------------------------------
テンプレート「ブログ記事」の再構築中にエラーが発生しました: <mtRegexFor>タグでエラーがありました: 不明なタグです: EntryMore
---------------------------------------------------------------------------------------------
原因が思い当たったらお教えいただければ幸いです。

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。