PHP正規表現で文字列を抽出する方法とは?

このQ&Aのポイント
  • PHPの正規表現を使って、複数のimgタグの中からURLと日本語文字列を抽出する方法について教えてください。
  • imgタグやHTMLタグ、日本語文字列が混ざった文字列から、URL毎に配列で取得し、日本語文字列は別で取得する方法が知りたいです。
  • PHPの正規表現がわからず、imgタグやURL、日本語文字列を取得する方法がわかりません。教えていただけると助かります。
回答を見る
  • ベストアンサー

【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
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
回答No.1

preg_match関数を使ってマッチした文字列を配列に取り出すのが簡単かなと思います。 preg_match("/http:\/\/[a-z0-9\/\-_\.]+/i",$string,$match); 実際の正規表現はもっと煮詰めて下さい。こうすると$match[1]にマッチした文字列が入ります。 日本語部分ですが、「タグ以外の文字列」という感じでいいのかな。だとするとstrip_tags関数あたりを使うといいのでは。

gincyoko
質問者

お礼

すごいです!出来ました。 どの関数を使えばいいのかも、なかなか検討さえ つかない状態だったので、本当に助かります。 有り難うございます。

関連するQ&A

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

    お世話中になります。 特定文字列の取り出し方が分かりません。 たとえば、下記のような文字列があります。 == $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
  • htmlの修正のため、正規表現で2つほど質問です。

    秀丸を使っています。 下記の2つをやりたいのですが、いまひとつうまくいきません。 ご教授いただけると幸いです。 <p><br /></p> <a href="a.html">あいうえお</a><br /> <a href="k.html">かきくけこ</a><br /> <p><br /></p> ↓ <p><br /></p> あいうえお<br /> かきくけこ<br /> <p><br /></p> <img alt="" src="../images/aaa.jpg" /> <img alt="" src="../images/bbb.jpg" /> ↓ <a href="index.html"><img border="0" alt="" src="../images/aaa.jpg" /></a> <a href="index.html"><img border="0" alt="" src="../images/bbb.jpg" /></a>

  • Excelから任意の文字列を抽出したい

    A列にリンクのタグがあるのですが、このような文字列から【リンク先】という部分と、【<img src="" alt="">】の部分だけを取り出したいと思いますが、上手く出来ません。 A列に入っているタグは→<a href="リンク先" target="blank"><img src="" alt=""></a> A列にリンクのタグが入っています。 B列に【リンク先】 C列に【<img src="" alt="">】 となるようにしたいです。 又A列の文字列には、<img src="" alt="">が続いて2つか3つ入っているものもありますが、その場合は、D列・E列に順番に抽出したいです。 最大でも<img src="" alt="">は4つまでしか入っておりません。 ダブルコーテーションの扱いなどがよく分からなくて、詳しかたいれば教えていただけるとありがたいです。 よろしくお願いいたします。 ※【】はわかりやすくするためのものです。

  • 正規表現で置換

    その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
  • 正規表現の否定先読みについて

    <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
  • 正規表現で抜き出した特定の文字列を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
  • PHPの正規表現で「style="<文字列>"」を

    PHPの正規表現で教えて下さい。 以下の文字列があります。 この文字列の中から、styleタグの中身を取得したいのですが、どのように正規表現を書いたらいいかわかりませんので、教えて下さい。 <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"> <img src="58065e517c7252ca0678a06e2ee8e730=" alt="" data-rotate="" data-rotatex="" data-rotatey="" data-size="," data-align="none" data-percentage="auto,auto" data-index="0" data-file-name="neko1.jpg" data-file-size="7136" data-origin="," style="color: gray; width: 300px"> </figure> </div> 上記文字列であれば「color: gray; width: 300px」のような文字列を取得したいです。 もしくは、「style="color: gray; width: 300px"」でも構いません。 よろしく御願い致します。

    • ベストアンサー
    • PHP
  • 文字の回りこみについて

    7タグという、ホームページ作成参考ページをみながら作り始めています。かずかずあった問題も、これまで自分で解決してこれたのですが、文字の回りこみについて、質問があります。 <IMG SRC="画像名.jpg" align="left">   <A HREF="profile.html">自己紹介</A> <br> <A HREF="link.html">日記</A> <br> <A HREF="link.html">掲示板</A> <br> <A HREF="link.html">リンク</A> と、align="left"という属性を入力すると「自己紹介」という文字が画像の右に表示されず、下に回りこみます、という説明があったのですが、どうやっても無理です。 ふと、ひらめいて、画像の下にスペース<br>を入れてみたら、自己紹介以下の文字列は下にゆくようになりましたが、こんな解決でいいのかなぁと思います。この場合、align="left"も必要ありませんでした。

    • ベストアンサー
    • HTML
  • htmlで文字列の回り込みが上手くできません。

    htmlの勉強を始めた初心者です。 画像の右側に文字を回り込ませようと下記のように入力したのですが、うまくできません。 どこがおかしいのでしょか? アドバイス宜しくお願いします。 <html> <head> <title>xxx</title>  </head> <body> <img src="xxx.jpg" width="145" height="40" align="left"> <h3>~xxxxx~</h3> </body> </html>

    • ベストアンサー
    • HTML
  • 正規表現(~を含まないものにマッチ)

    Perlの正規表現について質問です。 画像<img src="http://hogehoge.com/img/gokuu.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/pikkoro.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/bejiita.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/gohan.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/buruma.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> ↓ 処理後 ↓ 画像<img src="gazo_new1.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new2.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new3.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new4.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new5.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> (変更した画像:gokuu.jpg,pikkoro.jpg,bejiita.jpg,gohan.jpg,buruma.jpg,) 以上のように 画像URL部分のみを gazo_new(連番).jpg に変更させ、 変更前の画像URL一覧を表示させるスクリプトを書いてみました。 $htmldata にHTMLの全データが格納されているとします。 $i=1; while($htmldata=~/(<\s*img.*?src.*?=["\s]*)([.\/]*?\/)?((?:(?!gazo_new)[^"\s>])*)?["\s]?.*?>/i){ $imgurlparts .="$3,"; $htmldata=~ s/(<\s*img.*?src.*?=["\s]*)((?:(?!gazo_new)[^"\s>])*)?(["\s]?.*?>)/$1gazo_new$i.jpg$3/i; $i++; } $htmldata .="(変更した画像:$imgurlparts)"; どうにもうまく動きません。 何卒ご教示をお願い致します。

    • ベストアンサー
    • Perl