• ベストアンサー

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

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

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

  • ベストアンサー
  • 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)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

>括られた内部に「[[」、「]]」 みたところこの [[文字]]は間に他の文字を挟まず連続しているとしてよいのですよね? 以下で、どうですかね?ご呈示の文字列ではうまくいったと思うのだけど。 それから、ソースの文字コードはeucで実験しました。 $data = '[[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]]'; $pattern = '/\[\[画像[^\[\]]*(\[\[[^\[\]]*\]\])*[^\[\]]*\]\]/'; $pnum = preg_match_all($pattern, $da, $matches, PREG_OFFSET_CAPTURE ); print_r($matches); // $matches[0]の配列内にpattern全体にマッチした文字列群、$pnumにその個数が得られる // $matches[0][0][0] に求める一個目、$matches[0][1][0]に2個目、 // 配列3次元目の$matches[0][0][1]は文字列内のマッチ部分の開始位置オフセット(byte位置みたい?)

全文を見る
すると、全ての回答が全文表示されます。
  • RAPTsong
  • ベストアンサー率42% (74/175)
回答No.1

何が言いたいのか、サッパリわかりません。 1つ、2つ、というのは、何が基準になっているのでしょうか。 正規表現の書き方(表現)を質問したいのですか? それとも、PHP での(ソースコードレベルでの)正規表現の使い方を聞きたいのですか?

naktak
質問者

補足

開始が[[画像:、終了が]] 基準はこれです。 但し、質問にあるとおり、 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]]が 取り出される事になり、 その内部にある「[[」、「]]」って止まったり、そこだけ抜き出されたり、 [[画像:abcd.jpg|thumb|あいうえお([[あかさ]][[たなは]])]][[画像:abcd.jpg|thumb|かきくけこ([[かきく]][[けこさ]])]] これを1つとして抜き出してはダメです。 すみません、正規表現の書き方をご教示下さい。

全文を見る
すると、全ての回答が全文表示されます。

関連する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