特定文字列の取り出し方 複雑な正規表現

このQ&Aのポイント
  • 特定文字列の取り出し方が分かりません。正規表現を使用して特定の文字列を抽出する方法を教えてください。
  • 例えば、与えられた文字列から正規表現を使って「http://xyzxyz.com/20111101_123.jpg」と「http://xyzxyz.com/20111102_456.jpg」という特定の文字列を抽出することは可能ですか?
  • お手数ですが、正規表現のパターンと結果を教えていただけますと幸いです。
回答を見る
  • ベストアンサー

特定文字列の取り出し方 複雑な正規表現

お世話中になります。 特定文字列の取り出し方が分かりません。 たとえば、下記のような文字列があります。 == $contents ======================================== <img alt="Image813.jpg" class="pict" height="320" src="http://xyzxyz.com/20111101_123.jpg" width="240" /><br /> もう後2ヶ月です!!<br /> 早いですね。<br /> <br /> 写真はココちゃんです!<br /> <img alt="DSC_0052.JPG" class="pict" height="320" src="http://xyzxyz.com/20111101_456.jpg" width="240" /><br /> 今年の夏から発売し、たくさんのお客様に<br /> 食べていただいているソフトクリーム。<br /> <br /> 今のところ人気ランキングはこんな感じです。<br /> ちなみにソフトクリームは真冬の最高気温が5度の日でも<br /> 販売し続ける予定です!<br /> ================================================== この$contents という文字列から 「http://xyzxyz.com/20111101_123.jpg」 「http://xyzxyz.com/20111102_456.jpg」 を取り出し、ぞれぞれ配列に入れる場合の 正規表現はどのように記述すればいいですか? 下記の文字列を $contents として、 正規表現を $pattern 結果を $matches とします。 お忙しいところ 申し訳ありませんが、 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.2

<img> 要素の src 属性をマッチさせるとすればこんな感じでしょうか。 $matches = array(); $pattern = '/<img\s[^>]*src="([^"]*)"[^>]*>/i'; preg_match_all( $pattern, $contents, $matches ); $matches = $matches[1]; 厳密性を追求するのであれば、 HTML DOM Parser や xml parser を使って、 要素を順に検証した方が良いでしょう。

参考URL:
http://simplehtmldom.sourceforge.net/
miracle2006
質問者

お礼

ご回答ありがとうございます。 ご察しのとおり、RSSから抽出をしようとしています。 別のHPからタイトルなどの抽出法までは、参考にしてもらいました。 その中にパーサのことは書かれていました。 教えていただいた、正規表現で実行すると 気持ちいいくらいに、抽出され、 感動さえ覚えました。 正規表現は、あらゆる特定文字を抽出してしまうんですね。 私は、いくら勉強しても 正規表現の作れません。 本当に助かりました。 ありがとうございます。 また、質問するかもしれませんので、 そのときは、よろしくお願いします。

その他の回答 (1)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

例示された内容では、どういう正規表現が適切なのか判断しかねますが、 $pattern = '/http:\/\/xyzxyz\.com\/[0-9]+_[0-9]+\.jpg/'; とすれば preg_match_all($pattern, $contents, $matches); で $matches に(例示されたケースでは)画像ファイルのURLが取得出来ると思います。

miracle2006
質問者

お礼

ご回答ありがとうございます。 説明が足りなかったようで、申し訳ありません。 どんな場合でも、「xyzxyz」とは限りません。 その文字列から、画像のURLを抽出したかったのです。

関連するQ&A

  • 正規表現で抜き出した特定の文字列をDBに格納する

    外部Webページのソースから正規表現を用いて特定の文字列を抜き出したいと思っています。外部Webページのソースは以下の通りです。 <td>  <div class="s-box left">   <a href="URL"><img src="" alt="" width="" height="" border="" class="book" /></a>   <h3><a href="URL">書名</a></h3>   <h4>著者:文字列<br />定価(税込):500円</h4>  </div>  <div class="s-box center">   <a href="URL"><img src="" alt="" width="" height="" border="" class="book" /></a>   <h3><a href="URL">書名</a></h3>   <h4>著者:文字列<br />定価(税込):710円</h4>  </div>  <div class="s-box right">   <a href="URL"><img src="" alt="" width="" height="" border="" class="book" /></a>   <h3><a href="URL">書名</a></h3>   <h4>著者:文字列<br />定価(税込):730円</h4>  </div> </td> 上記のようなソースからdiv classごとに、 書名 著者:文字列 定価(税込):---円 という具合に抜き出したく思っていまが、正規表現がわからずプログラムが組めません。また、その抜き出した文字列をDB(MySQL)に自動的に格納するためにはどうしたらよいか。どなたかご教授頂けないでしょうか。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現の否定先読みについて

    <a href="http://example.com/aaaa/hogehoge1.jpg" target="_blank"><img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" target="_blank"> <img src="http://example.com/bbbb/hogehoge2.jpg" alt="huge2"></a> こういうHTMLがあるとします。改行はなく1行です。 このHTMLから正規表現で 『width="100"がついていない<img>タグ』 のsrc=""までを抜き出して置換したいのです。 期待する結果は <img src="http://example.com/hage/hogehoge2.jpg" です。 そこで /<img src="http:\/\/.*?.jpg"\s(?!width)/ というパターンを試しましたが、.*?の最短一致が思った通りにいかず <img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" と、1つ目の<img>が入ってしまい、2つ目の<a>タグまで抜き出されてしまいます。 これをうまくwidth="\d+"と入っていない<img>タグのみに適用させる方法はないでしょうか? どなたかよろしくおねがいいたします。

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

    その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
  • 【PHP 正規表現を使って文字列を抽出】

    いつもお世話になっております。 正規表現で行き詰っており、お知恵を拝借したいと 思います。 説明がわかりづらいかと思いますが、何卒ご教授お願いしたいと思います。 【↓こういった文字列から】 <img src="http://localhost/uploads/abc123.jpg" align="left" alt="" /><br /> <img src="http://localhost/uploads/def456.jpg" align="left" alt="" /><br /><br />日本語文字列や英語・数字など<br /><br /> imgタグが複数、HTMLタグ、日本語文字列が混ざった ものから、URLは複数あるのでURL毎に配列で取得し、 日本語文字列は日本語文字列だけで取得したいと思います。 最終的にこういうことができたらいいです・・。 $array[0]="http://localhost/uploads/abc123.jpg"; $array[1]="http://localhost/uploads/def456.jpg"; $damy="日本語文字列などなど"; 恥ずかしながら、私には複雑すぎて 全く分かりませんでした。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現を使いimgタグ内から幅と高さサイズを抜き出し

    正規表現を使いimgタグ内から幅と高さサイズを抜き出し phpにて正規表現を使い html の imgタグ内の width = "xxx" height = "xxx" を各々抜き出しその数字も個別に抜き出したいと思っております。 正規表現で行き詰っており、お知恵を拝借できればと思っております。 説明がわかりづらいかと思いますが、よろしくお願いしたいと思います。 下記のような文字列より <img src="http://test.co.jp/img/test01.jpg" alt="テスト画像です。" title="テスト画像です。" width="361" height="640" class="size-full wp-image-100" /> width="361" height="640" を個別に取りだし さらにその中の数字"361"を取り出したいと思っております。 正規表現に不慣れなので、お知恵をお借りいただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現で画像を置換

    <img src="http://domain.com/test1/sample1/20090226234426-P1150071_s.jpg" width="160" height="120" alt="TEST" /> となっているものを、 <a href="http://domain.com/test1/sample1/20090226234426-P1150071_s.jpg">画像</a> と置換したいのですが、正規表現がいまいち理解できませんでしたので、 質問させていただきました。 PC用のコンテンツから携帯に移植する際に内容の圧縮の意味を込めて、作る必要がありましたので、お手数ですがよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • preg_match_allで正規表現

    preg_match_allにて、次のように<img>が連続したソースから、 ※URLは全てダミーです <img src="http://a.com/a/a.jpg"><img width="10" src='http://b.com/b/b.gif' height="10"><img width="10" height="10" src='http://c.com/c/c.png"><img src=http://d.com/d/d.jpg><img src="http://e.com/hogefuga/e.jpg"> 個々のimgタグ全体と"<img~>"、 個々のsrc="~"のURLを抽出したいのですが、下記の条件でマッチさせることはできるでしょうか? 1. imgの属性位置・有無に問わず 2. 属性のくくりが、'" のどちらでも、または有無に問わず 3. src=~内に、"hogefuga"を含まないものにだけマッチ(否定形) 次のような正規表現で試したところ、 $pattern = '/<img.*?src=(\'|")?((?(?!hogefuga).)*\.(jpg|gif|png))(\'|")?.*?>/i'; 下のようにimgタグが1行づつ並んでいる場合は上手くいったのですが、連続して並んでいる場合は個々の、"<img~>"でマッチされませんでした。 ※URLは全てダミーです <img src="http://a.com/a/a.jpg"> <img width="10" src='http://b.com/b/b.gif' height="10"> <img width="10" height="10" src='http://c.com/c/c.png"> <img src=http://d.com/d/d.jpg> <img src="http://e.com/hogefuga/e.jpg"> 最終的にはsrc="~"のURLに応じて、画像をテキストリンクへ置換する、ということをしたいのですが、正規表現がよくわからず試行錯誤しています。 このような場合はどのような正規表現を書くべきなのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • jqureryスライドショーが上手くいきません。

    こんにちは。 web初心者です。 今、jqueryを使いスライドショーを作っているのですが 上手く行きません。 5枚の画像を重ねてフェードイン フェードアウトみたいな形にしてるのですが、最後の画像だけdisplay: none;が適用されなくてきれいに表示出来ません。 どなたか詳しい方、宜しくお願い致します。 <HTML> <div id="contents"> <div class="slideshow"> <img src="top30.jpg" width="950" height="450"> <img src="top21.jpg" width="950" height="450" class="alt"> <img src="top20.jpg" width="950" height="450" class="alt"> <img src="top22.jpg" width="950" height="450" class="alt"> <img src="top23.jpg" width="950" height="450" class="alt"> </div> </div> <CSS> #contents { width: 950px; margin-right: auto; margin-left: auto; height: auto; .slideshow { width: 950px; border-top-width: 1px; border-top-style: solid; clear: both; padding-top: 60px; height: auto; position: relative; float: left; } .slideshow img { position: absolute; } .slideshow img .alt { display: none; }

  • HTMLタグ

    画像にもありますが、取り扱い商品・液晶モニタ・パソコンパーツなどの横に横2列縦3列のテーブル、その横に縦5列横1列のテーブルを付けたいのですが、どうしてもわかりません。 わかる方居ましたらお願いします。 現在こんな感じです <p><font color="#f70006">&nbsp;&nbsp; <strong>他には無いアイテムがここにはあります</strong> </font> <br> <img style="WIDTH: 983px; HEIGHT: 102px" border="0" alt="" src="素材/top.png" width="1000" height="118"><br> <img border="0" alt="" src="素材/home.png" width="200" height="73"><img border="0" alt="" src="素材/商品一覧.png" width="200" height="73"><img border="0" alt="" src="素材/輸入.png" width="200" height="73"><img border="0" alt="" src="素材/買付.png" width="200" height="73"><img style="WIDTH: 169px; HEIGHT: 73px" border="0" alt="" src="素材/問合.png" width="170" height="73"><br> <br> <br> <br><img border="0" alt="" src="素材/取り扱い.png" width="164" height="49"><br> <img border="0" alt="" src="素材/液晶.png" width="164" height="49"><br> <img border="0" alt="" src="素材/apareru.png" width="164" height="49"><br> <img border="0" alt="" src="素材/pasokon.png" width="164" height="49"><br> <img border="0" alt="" src="素材/周辺機器.png" width="164" height="49"><br> <img border="0" alt="" src="素材/マルチメディア.png" width="164" height="49"><br> <img border="0" alt="" src="素材/自動車.png" width="164" height="49"><br> <br> <br> <br> <img border="0" alt="" src="素材/サポート.png" width="166" height="63"><br> <img border="0" alt="" src="素材/輸入について.png" width="166" height="63"><br> <img border="0" alt="" src="素材/お問い合わせ.png" width="166" height="63"><br> <img border="0" alt="" src="素材/会社概要.png" width="166" height="63"> </p> 他にいい作り方など、オススメ等ありましたら何でもお願いします

  • ブログにリンク画像を並べて付けたいのですが、下記のタグを入れると「※ボ

    ブログにリンク画像を並べて付けたいのですが、下記のタグを入れると「※ボタンをクリックしてね」の文字と画像の間に何行かの空白が出来てしまいます。これを詰めるにはどうしたらよいでしょうか? ※ボタンをクリックしてね <TABLE><TR> <TD><a href="リンク先"><img src="images/1103fukunoki.jpg" width="134" height="86" alt="" class="pict" /></a></TD><TD> <a href="リンク先"><img src="images/1123yabusati.jpg" width="134" height="86" alt="" class="pict" /></a></TD> </TR> </TABLE>

専門家に質問してみよう