本文から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パラグラフ。
<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 つのパラグラフ)で置き換えることで、目的のパラグラフを出力しています。
<mt:EntryBody regex_replace="/[\s\S]*((?:<p>[\s\S]*?<\/p>\s*?){2})[\s\S]*?/","$1">
考え方は先と同じですが、末尾で 2 つのパラグラフが取得できる範囲において、最初の「[\s\S]*
」の部分がもっとも長く文字列にマッチするようにしています。結果、先頭に近い不要なパラグラフが全て飲み込まれ、最終的には $1
で目的の末尾にあるパラグラフのみ出力されるようになっています。
<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つのパラグラフを取出す」と考えた場合、同じ正規表現式と見ることができます。