- ベストアンサー
正規表現を用いた特定の位置までの抜き出し方法
なんか考えると正規表現じゃムリじゃないと思えてきてならないのですが、 Wikipediaのデータのある部分の抜き出し方法です。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]] これを、これとして抜き出したいです。 「[[画像:」、「]]」で括られています。それで括られた内部に「[[」、「]]」が 存在する場合もあります。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]] このパターンなら2つを抜き出したいです。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[かきくけこ|さしすせそ]] このパターンなら1つを抜き出したいです。 こんな事、可能でしょうか?
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
$bad_subject = "[[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]]bb[[aaa]]"; $bad_subject .= "[[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]]"; preg_match_all( "/ \[ ( ( (?>[^][]+) | (?R) )* ) \] /x", $bad_subject, $matches); print_r($matches); Array ( [0] => Array ( [0] => [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]] [1] => [[aaa]] [2] => [[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]] ) [1] => Array ( [0] => [画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])] [1] => [aaa] [2] => [画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])] ) [2] => Array ( [0] => [画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])] [1] => [aaa] [2] => [画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])] ) ) ゴミ取りは自分でやって。ということで。
その他の回答 (12)
- mikaemi
- ベストアンサー率50% (33/65)
あぁそうか^^ $nested = qr/\[\[[^][]*(?:(??{$nested})[^][]*)*\]\]/; while ($str =~ /(\[\[画像:([^][]*|$nested)*\]\])/g) { print "$1\n"; } これでいいのかな。おやすみなさいませ(笑)
- mikaemi
- ベストアンサー率50% (33/65)
あかん。。画像: が入るとネストがまずい^^ $nested = qr/\[\[[^][]*(?:(??{$nested})[^][]*)*\]\]/; で引っ掛けないとしかたないか。。。失礼しました^^
- mikaemi
- ベストアンサー率50% (33/65)
http://www.kt.rim.or.jp/~kbk/regex/regex.html#PCRE に、正規表現の要約があります。sakusaker7 さんの使ってらっしゃる再帰表現の言及もあります。がんばってください^^ perl なら、 $nested = qr/\[\[画像:[^()]*(?:(??{$nested})[^()]*)*\]\]/; while ($str =~ /($nested)/g) { print "$1\n"; } で、OKみたいですけど^^
- mikaemi
- ベストアンサー率50% (33/65)
いやぁ。。無理っぽいけど^^
- mikaemi
- ベストアンサー率50% (33/65)
言語 Lua なんかだと、括弧のマッチ用の表現が用意されているのでかけそうですが、やっぱり、専用の正規表現が用意されていないとすると、無理っぽいですよねぇ。。^^
- mikaemi
- ベストアンサー率50% (33/65)
うーん。。でもダメかも^^ やはり、括弧の対応をしっかり見ないと。。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]]bb[[aaa]] やっぱり、パージングしたほうがよさそうな気がします^^;
- mikaemi
- ベストアンサー率50% (33/65)
なるほど。。『[[画像: ってのが入れ子ででてこないのなら…』という前提をもうけて、正規表現で表現するというのは、フレキシブルなソリューションですね^^ ひとつ気になった点は、'[[画像:' というパターンではなく、'画像'というパターンが、[[画像:...]]の...の中に含まれない場合にうまくいくのかな。。と思った点です。PHP の正規表現なら正しいのかな。。わたしは、Perl は知ってますが、PHP はまったく知らないので^^;
- sakusaker7
- ベストアンサー率62% (800/1280)
[[画像: ってのが入れ子ででてこないのなら $subject = "[[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]]"; preg_match_all("/\[\[画像: (?: (?! 画像 ). )+ \]\]/x", $subject, $matches); print_r($matches); Array ( [0] => Array ( [0] => [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]] [1] => [[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]] ) ) 多分処理速度は遅いです。
- mikaemi
- ベストアンサー率50% (33/65)
以下のURLに、 http://forum.tsukaeru.net/viewtopic.php?p=18090&sid=6b213576f960e2897308520d96fcf6b3 『PHPならHTML Parser for PHPですね』とありますから、自分で作らなくても、簡単なパーサを定義できるようですね。
- mikaemi
- ベストアンサー率50% (33/65)
任意の深さの入れ子構造を許し、対応する括弧を考慮して取り出すんですよね?よく「BNF だと表現できるけど、正規表現だと無理」と言われるようなパターンでしょう?それ専用の拡張された正規表現が可能じゃないと無理っぽいですよね(PHPに専用の正規表現があるかどうか知らない^^)。特定の深さまでの入れ子構造を許すだけなら、そのように正規表現を書いておけばできますけど。 再帰呼び出し構造でパージングする簡単なもの作るのがいいんじゃないですか?^^ LL 型の簡単なパーサでOKだと思いますよ。
- 1
- 2
お礼
皆さんありがとうございます!! 今日、#9さんの方法で何とか実現する事が出来ました! 昨日は諦めてしまい、今日見たら知らない間に活気付いてて驚きました(笑) 皆さんプロですね・・・。 6時って、、、凄いですね^^; 本当にありがとうございましたー。