• ベストアンサー

特定の文字を抽出

http://oshiete1.goo.ne.jp/qa2050546.html に似たような質問を見つけましたが、マニュアルで正規表現関数という項目をよんでも何のために使用するのかよくわかりませんでした。 そこで、 $data = "<html><head></head><body>こんにちは</body><html>"; echo $data; このような場合、「こんにちは」を抽出して $data2に当てはめることは可能でしょうか? ご存知の方おられましたらどうぞよろしくお願いいたします。

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

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

正規表現はプログラミングをするうえで、一つのハードルです。 なかなか覚えるのは大変ですが、ある程度使いこなせるようになるととても便利です。頑張りましょう。 $pat = "<html><head><\/head><body>(.+)<\/body><html>"; if(mb_ereg($pat,$data,$reg)){  $data2 = $reg[1];  echo $data2; } mb_ereg(パターン,文字列,マッチした場合は配列に格納) と言う関数です。 ()は、括弧内に入る文字列を$regの○番目の配列に格納、と言う意味で、.は任意の文字列、+は繰り返し、と言う事になります。ですから、(.+)は任意の文字列で文字数はいくつでも良いもの、ということになります。 この条件に一致した場合、mb_eregはTRUEを返し、$regの配列に格納する訳です。 同じく、リンク内のURLとaタグ内を抽出するような場合は if(mb_ereg("<a href=\"(.+)\">(.+)<\/a>",$txt,$reg)){  $url = $reg[1];  $link = $reg[2];  echo "URL={$url} リンク名={$link}"; } こんな感じになります。 なお、PHPでサポートしているのはereg、PERL互換のpreg、マルチバイトにも対応したmb_ereg等があります。 正規表現についてはググって勉強して下さい。 http://www.google.co.jp/search?q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE

jyuu
質問者

お礼

ありがとうございます。 以下のようにしてみたのですが、 Parse error: parse error, unexpected '@' in ファイルのロケーション on line 13 と出ました。もしお時間があるようでしたら見ていただけないでしょうか? <? $data = "<html><head></head><body> こんにちは<br> <a href=\"http://www.hogehoge.co.jp/hoge.jpg\" target=_blank> <img src=\"http://www.hogehoge.co.jp/hoge.jpg\"></a><br> はじめまして<br> <a href=\"http://www.hogehoge.co.jp/hoge02.jpg\" target=_blank> <img src=\"http://www.hogehoge.co.jp/hoge02.jpg\"></a><br> </body><html>"; if(mb_ereg("<a href=\"(.+)\">(.+)<\/a>",$data,$reg)){  $url = "$reg[0]";  $link = "$reg[2]";  echo "URL={$url} リンク名={$link}"; } ?>

jyuu
質問者

補足

if(mb_ereg("<a href=\"(.+)\">(.+)<\/a>",$data,$reg)){ を if(mb_ereg("#<a href=\"(.+)\">(.+)<\/a>#",$txt,$reg)){ #でくくるとエラーはなくなりましたが、2つ目の$linkが吐き出してくれないです。 この場合ですと<img src="http://www.hogehoge.co.jp/hoge.jpg">という結果が期待できると思うのですが、どうしてなのでしょうか?

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

その他の回答 (2)

回答No.3

#2です リンクのほうはいろいろなタグが混在している事等は想定していないので、結果は期待通りに行かないと思います。 検索結果が一つの場合は問題ありませんが、複数の場合は最長のものが検索されてしまいます。 ですから、一番目には ​http://www.hogehoge.co.jp/hoge.jpg​\" target=_blank> <img src=\"​http://www.hogehoge.co.jp/hoge.jpg​​ が検索され、二番目には \"></a> のタグの間の部分が検索されてしまうのです。 複数ある場合には事前に配列に切り出してから、都度検索するのが良いと思います。切り出しにはmb_splitやexplodeを利用すると良いです。 また、文字クラスを使うのも有効です。[]の中が文字クラスです。 "<a href=\"(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\">(.+)<\/a>" httpかhttpsで始まり、://に続いて[]文字クラスの中の文字の繰り返し まぁ、最初はチンプンカンプンでしょうが、徐々に慣れていくしかないんじゃないでしょうか。

jyuu
質問者

お礼

ありがとうございます。がんばって正規表現に慣れようと思います。

すると、全ての回答が全文表示されます。
  • f_motion
  • ベストアンサー率53% (7/13)
回答No.1

タグをはずしたいのならば、 $data2 = strip_tags($data); echo $data2;

jyuu
質問者

補足

すみません、かなり説明不足でした。少し質問の表現方法を変えさせてください。 $data = "<html><head></head><body> <b>こんにちは</b><br> <A href=\"http://www.hogehoge.co.jp/hoge.jpg\" target=_blank> <img src=\"http://www.hogehoge.co.jp/hoge.jpg>\"</a><br> はじめまして<br> <A href=\"http://www.hogehoge.co.jp/hoge02.jpg\" target=_blank> <img src=\"http://www.hogehoge.co.jp/hoge02.jpg>\"</a><br> </body><html>"; echo $data; いろんなタグがある中で、一番初めに出てきたimgのタグの中にある「http://http://www.hogehoge.co.jp/.hoge.jpg」 のみを抽出する方法を探しています。 自分で引き続き検索を繰り返したところ、 http://oshiete1.goo.ne.jp/qa2215156.html http://oshiete1.goo.ne.jp/qa1466726.html に似たような回答を見つけました。preg_match_allを使用するのがよいのでしょうか?正規表現というものに慣れていないため、かなりてこづっています。 この場合、 preg_match_all('/<img[^>].*?>(.*?)<\>/', $data, $matches); でうまくいかないのですが、どのようにするのがよいのでしょうか?

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

関連するQ&A