• ベストアンサー

正規表現を用いた特定の位置までの抜き出し方法

なんか考えると正規表現じゃムリじゃないと思えてきてならないのですが、 Wikipediaのデータのある部分の抜き出し方法です。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]] これを、これとして抜き出したいです。 「[[画像:」、「]]」で括られています。それで括られた内部に「[[」、「]]」が 存在する場合もあります。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]] このパターンなら2つを抜き出したいです。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[かきくけこ|さしすせそ]] このパターンなら1つを抜き出したいです。 こんな事、可能でしょうか?

  • PHP
  • 回答数13
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.9

$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)
回答No.13

あぁそうか^^  $nested = qr/\[\[[^][]*(?:(??{$nested})[^][]*)*\]\]/;  while ($str =~ /(\[\[画像:([^][]*|$nested)*\]\])/g) {   print "$1\n";  } これでいいのかな。おやすみなさいませ(笑)

naktak
質問者

お礼

皆さんありがとうございます!! 今日、#9さんの方法で何とか実現する事が出来ました! 昨日は諦めてしまい、今日見たら知らない間に活気付いてて驚きました(笑) 皆さんプロですね・・・。 6時って、、、凄いですね^^; 本当にありがとうございましたー。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.12

あかん。。画像: が入るとネストがまずい^^ $nested = qr/\[\[[^][]*(?:(??{$nested})[^][]*)*\]\]/; で引っ掛けないとしかたないか。。。失礼しました^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.11

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)
回答No.10

いやぁ。。無理っぽいけど^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.8

言語 Lua なんかだと、括弧のマッチ用の表現が用意されているのでかけそうですが、やっぱり、専用の正規表現が用意されていないとすると、無理っぽいですよねぇ。。^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.7

うーん。。でもダメかも^^ やはり、括弧の対応をしっかり見ないと。。 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]]bb[[aaa]] やっぱり、パージングしたほうがよさそうな気がします^^;

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.6

なるほど。。『[[画像: ってのが入れ子ででてこないのなら…』という前提をもうけて、正規表現で表現するというのは、フレキシブルなソリューションですね^^ ひとつ気になった点は、'[[画像:' というパターンではなく、'画像'というパターンが、[[画像:...]]の...の中に含まれない場合にうまくいくのかな。。と思った点です。PHP の正規表現なら正しいのかな。。わたしは、Perl は知ってますが、PHP はまったく知らないので^^;

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

[[画像: ってのが入れ子ででてこないのなら $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)
回答No.4

以下のURLに、 http://forum.tsukaeru.net/viewtopic.php?p=18090&sid=6b213576f960e2897308520d96fcf6b3 『PHPならHTML Parser for PHPですね』とありますから、自分で作らなくても、簡単なパーサを定義できるようですね。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

任意の深さの入れ子構造を許し、対応する括弧を考慮して取り出すんですよね?よく「BNF だと表現できるけど、正規表現だと無理」と言われるようなパターンでしょう?それ専用の拡張された正規表現が可能じゃないと無理っぽいですよね(PHPに専用の正規表現があるかどうか知らない^^)。特定の深さまでの入れ子構造を許すだけなら、そのように正規表現を書いておけばできますけど。 再帰呼び出し構造でパージングする簡単なもの作るのがいいんじゃないですか?^^ LL 型の簡単なパーサでOKだと思いますよ。

関連するQ&A

  • 正規表現についての質問

    正規表現についての質問です。 どのようにすればいいのか分からずで困っております。 (1) ##画像ファイル:"test.jpg"## という文字列の場合は、test.jpgに置換 (2) ##画像ファイル:"test.jpg":"aiueo.jpg"## という文字列の場合は、 aiueo.jpg 上記を満たす、正規表現での記述方法をどなたかご教授頂けないでしょうか。

    • 締切済み
    • PHP
  • 正規表現の利用方法

    Perlで指定ディレクトリ内の画像を一覧表示しするプログラムを作っています。画像は日記に使用しているもので、画像のファイル名を2007121601.jpgつまり、年・月・日・番号の様に命名ルールを決めておき、表示した画像から該当記事にリンクしたいのです。(記事はHTMLファイルで、200712.htmlの様に、年・月という命名ルールにしてあります) そのために、正規表現を使って試みているのですが、 上手く該当記事にリンクさせるところが出来ません。 ↓yyyymmddnn形式の画像を正規表現で表現 grep{ /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})\.+(jpg$|gif$|png$)/ } ↓画像表示&記事へリンク print "<a href=\"★\"><img src=\"img/$file\"></a>\n"; ★の部分に、上の正規表現から年・月の部分、つまり、([0-9]{4})([0-9]{2})を何らかの形で抜き出して記事URL(年・月.html)を表現したいのです。どなたかお分かりでしたらご教授下さい。

    • ベストアンサー
    • Perl
  • Perlの正規表現

    Perlの正規表現 Perlの正規表現で質問です。 MT4.13を使用して携帯用サイトを構築しています。 今現在、携帯用記事中の画像を縮小して表示しようと「regex_replace」を 使って、記事中のimgタグからsrc部分を抜き出して外部のphpに飛ばしています。 <$MTEntryBody regex_replace="/<img (.*?)src=\"(.*?\.jpg)\"(.*?)>/ig","<img src="phpスクリプト?img=\\2" border="0" />"$> 記事中のjpg(JPG)画像のsrc部分を拾って、phpに渡し、GDで縮小した画像を表示すると言った感じです。 しかし、regex_replaceの正規表現部分が上手く機能していないのか、jpg画像の最後の一枚のみ変換されると言った具合です。 JPG画像も含めて、記事中全てのjpg(JPG)画像を縮小して表示したいのですが、正規表現が思い浮かばず質問しました。 上記以外にも /<img (.*?)src=\"(.*)?(\.jpg|\.JPG)\"(.*?)>/ig などとしましたが上手くいきませんでした。 ちなみに、phpで画像を縮小する部分は問題なく動作しています。 以上、宜しくお願い致します。

  • 正規表現についての質問

    正規表現を使って、文字列を抜き出したいのですがどうすればよいでしょうか? 対象となる文字列→<ここは文章>##あいうえお[1]:"test.jpg"##<ここは文章> 抜き出したい文字例→##あいうえお[1]:"test.jpg"## の##で囲まれた箇所です。 正規表現ど素人なため、どなたかご教授くださいm(_)m

    • ベストアンサー
    • PHP
  • Javaの正規表現を使った画像URLの自動リンクができません

    Java(version 1.5.0_05)の正規表現を使った画像URLの自動リンクで 行き詰っています。 通常のリンクタグは pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:&?,=#]+",Pattern.CASE_INSENSITIVE); でうまく変換できているのですが、 画像の場合、 pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:&?,=#]+(jpg|jpeg|gif|png|bmp)",Pattern.CASE_INSENSITIVE); としてもマッチせず、 変換ができません。 正規表現が間違えているのは分かっているのですが、 どこをどう変えたらよいのか教えてください。 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • 正規表現で、00で始まる画像をgrep検索したいのですが、どう書けばよ

    正規表現で、00で始まる画像をgrep検索したいのですが、どう書けばよいでしょうか? ネットで調べてやってみたところ、下記のような感じになったのですが、もう少しスマートな書き方をするには、どうすればよいでしょうか? 00+.+.+(?=jpg) これだと、例えば「004-main.jpg」だけではなく、「400-thumbs.jpg」なども検索されてしまいます。 ■探したい対象の中身の例(明示的な規則性はありません) 900.jpg <img src="images/400_300_1.jpg" alt="正規表現分からない" width="400" height="300" border="0">400_300_2.jpg<a href="#" target="_blank"></a> 002_main.jpg <br />005.jpg<br /> 006_thumb.jpg ■また、行の先頭にマッチするという「^」について知りたいのですが、行頭というのは何を持って 行頭と見做されるのでしょうか? 改行の後の文字=行頭ということなのでしょうか? ■例えば、下記のような中から、005-main.jpgを検索しようとする場合、必ず<br />の後に005-main.jpgがくる、みたいな法則性がないと、いわゆる単語単位での切り取りみたいなのは出来ないのでしょうか? <br />005-main.jpg<br />

  • 正規表現でタグの中を除く文字をマッチングするには

    正規表現でタグの中を除く文字をマッチングするしたいのですが 良い方法はありますでしょうか。 例えば <a>のタグの中にない、"あい"を"かき"に変換したい。 <a>あいうえお</a>あいうえお ↓ <a>あいうえお</a>かきうえお という様にしたいのです。 正規表現では向かない処理かも知れませんが、 良い書き方ありましたら教えてください。

    • ベストアンサー
    • Java
  • 正規表現で置換

    その1 $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; その2 $str = "<img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="http://yyy.hoge.jp/hage/hige/xxxx.jpg" width="320" height="240" />ほげほげ"; ↓ $str = "<img src="./foo/xxxx.jpg" width="320" height="240" />ほげほげほげ<a href="http://xxxx.xxxx.xxx/xxxx/">ほげほげほげ</a>ほげほげ<br /><br /><img src="./foo/faa/fii/xxx.jpg" width="320" height="240" />ほげほげ"; このような文字列があった時に、次のように従って置換したいです。 1.imgのタグの内部に、「http://yyy.hoge.jp/hage/hige/xxx.jpg」という文字列があった場合、「./foo/faa/fii/xxx.jpg」という文字列に置き換える。 2.それ以外のURLの場合は置換しない。 3.その1とその2では「xxx.jpg」となっていますが、jpg以外の拡張子の場合も存在する。 4.日本語とURLの位置や個数はバラバラです。 5.URLの中のxxxとyyyは不定の文字列で、hage、hoge、hige、foo、faa、fiiは固定です。 6.使用している言語はPHPです。正規表現を1度だけでできれば理想的ですが、今回は2回に渡った処理でも問題ありません。 以上です。正しく処理できる正規表現、あるいは下記の正規表現の誤りを教えて頂ければ幸いです。 お手数ですが、よろしくお願い致します。 下記の方法では、うまくできませんでした。 $pattern = "/http:\/\/.*?hoge.jp\//"; $replacement = "./"; $str= preg_replace($pattern, $replacement, $str); $pattern2 = '/\/?hage\/hoge/'; $str = preg_replace($pattern2, '/foo/faa/fii', $str);

    • ベストアンサー
    • PHP
  • 正規表現で [ ] を探したい

    正規表現の説明のサイトなど、調べてみたのですが、分からなかったのでお聞きします。 現在下記のようなテキストデータがあります。 []は半角カッコです。 ************* : [かきこ] あいうえお ばびぶべぼ [まみむめもI らりるれろ かきくけこ : ************* OCR処理をしている為、カッコ"]"が"I"大文字半角のアイになっている箇所があります。 その間違いを捜し当てたいのですが、 [ I I ] I I の3パターンあると思うのですが、それぞれを探せる正規表現を教えていただけないでしょうか? どなたかご教授願います。

  • Perl 正規表現に関して

    現在Perlにて正規表現を用い,アクセス者のログが納めてあるlog.datからデータを検索し集計するといったアルゴリズムです. ところが正規表現を用いたのは良いものの,アルファベット以外をパターンとして使用したとき,データを呼び出すどころか表示されない状況に陥ってしまいました. elsif($referer =~ /abcd/i) { $word2 = "abcd"; } 上記のコードは,パターンがアルファベットで構成されているため,正常にシステムが動作します. elsif($referer =~ /あいうえ/i) { $word2 = "あいうえ"; } しかし,上記のコードはパターンが平仮名で構成されているため,冒頭で記している問題が発生してしまいます. そこで (1)パターンにアルファベット以外のものは使えるのか. (2)パターンにアルファベット以外のものを使いたいときはどうすればいいのか. についてお教えください. また正規表現のほかに,文字列を検索し,頻度をカウントすることに長けているコードがございましたらお教え願います. 以上の内容で不明な点等ございましたら随時対応致します. 宜しくお願いします.

    • ベストアンサー
    • Perl