MovableType で本文などから指定した段落だけを抜き出す

Posted by
ぴろり
Posted at
2012/09/22 20:08
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
MovableType カテゴリ
カバーイメージ
本文からX文字を抜き出して表示は、trim_toや色んな方法で出来ると思うのですが、指定した段落を抜き出して表示すると言う事は可能でしょうか? 例えば、最初の2段落だけ抜き出して表示する。等です。 本文の指定した段落だけを抜き出す - MTQ | Movable Type 5 ユーザーコミュニティ

 というわけでやってみました。プラグインなどを用いずに、標準にある regex_replace モディファイヤだけで実現可能です。

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

 以下のように入力されていた場合;

第1パラグラフ。第1パラグラフ。第1パラグラフ。
第1パラグラフ。第1パラグラフ。

第2パラグラフ。第2パラグラフ。
第2パラグラフ。第2パラグラフ。第2パラグラフ。
第2パラグラフ。

第3パラグラフ。第3パラグラフ。第3パラグラフ。

第4パラグラフ。第4パラグラフ。第4パラグラフ。第4パラグラフ。
第4パラグラフ。第4パラグラフ。第4パラグラフ。

第5パラグラフ。第5パラグラフ。

第1、第2パラグラフ(先頭 2 つ)のみ出力する場合

<mt:EntryBody regex_replace="/[\s\S]*?((?:<p>[\s\S]*?<\/p>\s*?){2})[\s\S]*/","$1">

 正規表現式を順に見ていくと、先ず「[\s\S]*?」の部分で、パラグラフの開始(<p> タグ)に先行する何らかの文字や空白改行にマッチさせています。次に「((?:<p>[\s\S]*?<\/p>\s*?){2})」の部分で 2 つのパラグラフを取出していて、最後に「[\s\S]*」で残った部分を全てマッチさせています。これらのパターンによって本文全体がマッチしますが、それを最終的に $1 (= 2 つのパラグラフ)で置き換えることで、目的のパラグラフを出力しています。

第4、第5パラグラフ(末尾 2 つ)のみ出力する場合

<mt:EntryBody regex_replace="/[\s\S]*((?:<p>[\s\S]*?<\/p>\s*?){2})[\s\S]*?/","$1">

 考え方は先と同じですが、末尾で 2 つのパラグラフが取得できる範囲において、最初の「[\s\S]*」の部分がもっとも長く文字列にマッチするようにしています。結果、先頭に近い不要なパラグラフが全て飲み込まれ、最終的には $1 で目的の末尾にあるパラグラフのみ出力されるようになっています。

第2、第3パラグラフ(先頭 1 つを捨てて次の 2 つ)のみ出力する場合

<mt:EntryBody regex_replace="/[\s\S]*?(?:<p>[\s\S]*?<\/p>\s*?){1}((?:<p>[\s\S]*?<\/p>\s*?){2})[\s\S]*/","$1">

 先ず「[\s\S]*?」の部分で、パラグラフの開始(<p> タグ)に先行する何らかの文字や空白改行にマッチさせています。次に「(?:<p>[\s\S]*?<\/p>\s*?){1}」の部分で、先頭から 1 つのパラグラフにマッチさせていますが、グループ化されていないのでマッチした結果は捨てられます。続いて「((?:<p>[\s\S]*?<\/p>\s*?){2})」の部分で 2 つのパラグラフにマッチさせていますが、先と違うのはグループ化して後ほど参照できるようにしてある点です。そして最後に「[\s\S]*」の部分で残り全てをマッチさせます。これらのパターンは本文全体にマッチしますので、それを最終的に $1 に置換すれば、目的のパラグラフだけを出力できます。
 最初の "第1、第2パラグラフ(先頭 2 つ)のみ出力する場合" は、「先頭 0 個のパラグラフを捨てて、次の2つのパラグラフを取出す」と考えた場合、同じ正規表現式と見ることができます。

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


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

カバー画像:CAPTCHA によるコメントスパム対策

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

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

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

コメントを投稿する

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