Text_Wiki_Mediawiki を使って、wikipedia の本文をパースしています。

ですが困ったことに、二重角括弧( {{ }} ) の部分が HTML として残ってしまいます。
少し省略して書きますが、例えば以下のような部分です。

{{Infobox Language|name=日本語
|nativename={{lang|it|日本語}}
|pronunciation=/{{IPA|nʲiɦoŋŋo}} ({{IPA|nʲippoŋŋo}})/
|familycolor=#dddddd
|states=[[日本]]など(「[[#分布|分布]]」の節参照)
|region=[[東アジア]]など
}}

この角括弧及びその中に書かれた文字列を全て削除したく、
改行コードを削除後、PHP で
preg_replace( '/{{.+?}}/', '', $result );
と書きましたが角括弧が入れ子になっているためかうまくいきません。
そこで以下のいずれか、または分かる限りの方法を教えてください。

 ★入れ子になっている角括弧及び角括弧の中の文字列の削除方法。
  方法は PHP または、Pear::Text_Wiki_Mediawiki のメソッドを使用した方法で。
 ★削除せずにPear::Text_Wiki_Mediawikiを使って、きちんと人間が閲覧できる
  形式の HTML に変換する方法。(ルールを追加すればよい??)


回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2008/12/19 20:17:49
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:i_kumagoro No.1

回答回数170ベストアンサー獲得回数58

ポイント75pt

正規表現の再帰を使えば

$result = preg_replace('/{{([^{}]|{[^{]|}[^}]|(?R))*?}}/', '', $result);

のような形でできると思います。再帰が使えない場合は

$old = '';
while (!($old === $result)) {
	$old = $result;
	$result = preg_replace('/{{([^{}]|{[^{]|}[^}])*?}}/', '', $old);
 }

のようなコードを書くといけると思います。

id:snaa1d_1

返信が遅くなり申し訳ありません。

ありがとうございます。無事、タグを除去することができました。

2008/12/19 20:12:54
  • id:i_kumagoro
    回答に書き忘れていたので追記。角括弧は'[]'で、'{}'は波括弧です。
  • id:snaa1d_1
    うーん、私のスキル不足で申し訳ないのですが、
    教えて頂いた正規表現を以下のように解釈しました。


    {{  ではじまり、
    }} で終わり、
    このはじまりと終わりの間に
    {} または { または } がはいっていないものにマッチする。


    で安直に

    /{{([a-zA-Z0-9]|(?R))*?}}/
    とか
    /{{(.+|(?R))*?}}/
    とか
    /{{(\w|(?R))*?}}/
    と書き換えてみたのですがそれではうまくいかないのですね。
    もうちょっと勉強してみます。
    そもそも解釈が間違っていたら教えて下さい。
  • id:i_kumagoro
    書きあがった正規表現の結果だけをみると余計に分かりにくいと
    思いますので要点だけ。
    ・'{{'で始まり'}}'で終わる。
    ・中身は
     ・'{'と'}'以外の文字 '[^{}]'
     ・連続しない'{'はあってもよいので'{'とそれに続く'{'以外の文字 '{[^{]'
     ・連続しない'}'はあってもよいので'}'とそれに続く'}'以外の文字 '}[^}]'
     ・再帰 ('{{'で始まり'}}'で終わり、中身は...) '(?R)'
     のいずれかの繰り返しで最短マッチ。 '*?'
    という表現です。
    再帰がない場合は入れ子の一番内側にのみマッチします。

    今気付きましたが、この正規表現では'{}}'や'}{{'のような並びがあると
    うまく動作しないかもしれません。
  • id:snaa1d_1
    なるほど、、今、何となく感覚的にですがしっかり理解ができました。
    お陰様で正規表現の使い道の幅が大分広がりました。
    ありがとうございます、大変感謝です!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません