HTMLソースからタグ内のテキストを配列に

このQ&Aのポイント
  • HTMLソースから特定のタグ内のテキストを配列に格納する方法について質問です。
  • 現在、<h2></h2>タグで囲まれたテキストを配列に格納する方法を実装しています。
  • しかし、<h2 class="~"></h2>のようにclass属性が指定されたタグや、他のタグ内のテキストも取得できるようにしたいです。どのようにすればよいでしょうか?
回答を見る
  • ベストアンサー

htmlソースからタグ内のテキストを配列に

お世話になっております。 $addfname = trim($_POST["url"]); $html = file_get_contents($addfname); $html = mb_convert_encoding($html,"EUC-JP","auto"); 以上のように、フォームに入力されたURLを読み込み、各タグ内に記述されたテキストなどを排出(配列に格納)しようと思い、<h2></h2>のようにh2タグで囲まれたテキストは、 $pattern = '/<h2>(.*)<\/h2>/is'; $match = array(); preg_match_all($pattern, $html, $match, PREG_SET_ORDER); $h2text1 = str_replace("<h2>", "", $match4[0][0]); $h2text2 = str_replace("</h2>", "\t", $h2text1); $h2array = explode("\t", $h2text2); $h2cnt = count($h2array)-1; とすることで、なんとか配列に格納することが出来ました。 が、しかし、CSSなどで、<h2 class="~"></h2>となっていたりすると、正常に読み込むことが出来ず、</h2>タグ以降のテキストなども読み込んでしまいます。 配列に格納する方法も、どこかぎこちないように思えたりもしますが、以上のような、idや、classなど、<h2>だけで括られている以外のテキストなども読み込むには、どのようにしたら宜しいのでしょうか? お忙しいなか恐縮ですが、アドバイスのほどよろしくお願い申し上げます。

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

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

  • ベストアンサー
  • mpx
  • ベストアンサー率71% (149/209)
回答No.1

とりあえずh2タグで囲まれた文字を配列$h2arrayに入れればいいのであれば、下記で如何でしょう <?php $html=<<<_HTML_ dummy0 <h2>1st item</h2> dummy1 <H2 class="hoge">2nd item</H2> dummy2 <h2 id='test'>3rd item</h2> dummy3 _HTML_; $pattern = '/<h2.*?>(.*?)<\/h2>/i'; preg_match_all($pattern, $html, $match); $h2array=$match[1]; print_r($h2array); ?>

mayu_chap
質問者

お礼

mpxさんへ こんばんは。早速の対応をありがとう御座います! 勉強不足なことが最大の原因ですが、色々と調べてやっと解決できたと思った後の不具合?だったので落胆するところでしたが、ご指導いただき願っていた結果を得ることができ感謝いたします。 この正規表現の理解を深めたいとは思っておりますが、また同じような質問をすることも多々あるか思いますが、また見かけたときには宜しくお願い致します。ありがとう御座いました。

関連するQ&A

  • htmlソースからタグ内のテキストを配列に2

    お世話になっております。 昨日も同じような質問をさせていただいたのですが、htmlファイルの内容をPOSTで取得したとき、そのソース内にある、javascript、noscriptがあった場合、それぞれのタグ内にあるURLを配列内に取り込みたいと考えております。 そこで、これまで試していたものはもちろん、先日お教えいただいた以下のソースを参考にしているのですが、URLを取得するまでに至りません。 <?php $html=<<<_HTML_ <SCRIPT TYPE="text/javascript" SRC="http://www.○○○.com" charset="EUC-JP"></SCRIPT> <NOSCRIPT> <div align="center" style="font-size:12px;"> <a href=http://www.△△△.net/>カウンター</a> <a href=http://www.□□□.com/>アクセス解析</a> </div> </NOSCRIPT> _HTML_; $pattern_java = '/<SCRIPT TYPE= .*?SRC="(.*?)".*?>>/is'; $match_java = array(); preg_match_all($pattern_java, $html, $match_java, PREG_SET_ORDER); $meta_java = $match_java[0][1]; $cnt_java = count($match_java); ?> 2日続けて同じような質問をすることに恐縮するとともに、お恥ずかしいことと自覚はしているものの、解決策が見いだせずに困っています。 お忙しいなか恐縮ですが、アドバイスなど頂戴出来れば幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 不要な配列を消したい

    2次元配列で、不要な要素を取り除きたいのですが良い方法が思い浮かばず、どうしたものかと悩んでいます。 一番初めと5番目を消したいのですが、preg_match で日付の2006にマッチしない要素をunsetしてみましたがうまくいきませんでした。 $data = array ( array('<br>'), array("2006 03 22", test), array("2006 03 23", test2), array("2006 03 25", test3), array('') ); $pattern = '/2006/'; foreach($data as $key => $value) { if(preg_match($pattern, $value[$key])) { unset($data[$key]); } } もし方法をご存知のかたおられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • preg_replace_callback が渡す変数の扱い

    preg_replcace_callback を使用して、<a>タグ内のURLの字数を制御するコードに取り組んでいます。詳しい方アドバイスしてくださると助かります。 下のコードの、shorten(カスタム関数)に渡されるデータが配列なのですが、並列に並んだ配列のようなのです。echo をかけてみると、ArrayArray と表示されます。しかし、Array([0]=>Array [1]=>Array) ではないので、どうやって 処理をかけて return すればよいのか途方にくれています。 もしよい方法をご存知の方おられましたらどうぞよろしくお願いいたします。 <? $str = <<<HERE //長いURLのサンプルです。ここの掲示板の処理で途中で表示がカットされていますが、<a href="http://長いURL">http://長いURL</a>という構成になっています。 <a href="http://gooooooooooooooooooooooooooooooooooogle.co.jp">http://gooooooooooooooooooooooooooooooooooogle.co.jp[</a> <a href="http://yahooooooooooooooooooooooooooooooooooo.co.jp">http://yahooooooooooooooooooooooooooooooooooo.co.jp</a> HERE; $pattern = "#<a(.*?)>(.*?)<\/a>#s"; $str = preg_replace_callback($pattern, 'shorten', $str); echo $str; function shorten($matches) { foreach($matches as $index => $match) { if (strlen($match) > 20) { $matches[$index] = substr($match, 0, 20) . '....'; } } return $matches; } ?>

    • ベストアンサー
    • PHP
  • タグをテキストに置き換えた後にURLを読み取る方法

    掲示板にURLが入力された際に自動でリンク生成ができるようにしているのですが、タグをテキストに置き換えて(HtmlSpecialChars)実行すると上手くいきません… こんな感じです。 多少省略しています。 「&」に問題があるのでしょうか・・・ $text = HtmlSpecialChars($rec['value']); $text = preg_replace("/&gt;&gt;([0-9]+)/","<a href=\"./test.php?id=$id&end_id=\\1\">>>\\1</a>",$text);

    • ベストアンサー
    • PHP
  • テキストを多次元配列に格納したい

    $text="1;2;3:4;5;6:7;8;9:10;11;12:…"; $tmp = split(":",$text); これでtmpで格納された1;2;3、4;5;6、7;8;9、10;11;12をさらに分けて、多次元配列で格納しようと思います。 すなわち多次元配列"arrayについて、 print_r($array[0])の出力結果がArray ( [0] => 1 [1] => 2 [2] => 3 ) print_r($array[2])の出力結果がArray ( [0] => 7 [1] => 8 [2] => 9 ) となるような感じです。 しかし自分ではtmpからarrayへの変換がうまくいきません。 どなたかこのような働きをするコードを教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • htmlソースからアンカータグ内のURLを配列に

    お世話になっております。 file_get_contents()で取得したhtmlファイルのソースにある、アンカータグに設置されている、URLおよび、そのアンカータグに囲まれたテキストを取得して配列に収めたいと考えているのですが、いろいろと調べていても、思うような結果を出せずにいる状況です。 あるサイトにて、以下のようなソースがあり、これをヒントとしているものの、初めて目にする配列の中の配列?に戸惑い、その分解の仕方が分からず、またアンカータグ内に、target="_blank"などの記述があったりすると、配列に収めることが出来なかったりで、対処の仕方がwからずにいる状況です。 $html = ' <ul> <li><a href="http://www.yahoo.co.jp/">Yahoo!JAPAN</a></li> <li><a href="http://jp.msn.com/">MSN</a></li> <li><a href="http://www.google.co.jp/">Google</a></li> </ul> '; $pattern = '/<a href="([^"]+)">(.+?)<\/a>/is'; $match = array(); preg_match_all($pattern, $html, $match, PREG_SET_ORDER); var_export($match); echo "<br><br>"; print_r($match); 知識が乏しく、お恥ずかしいところと思うことろではありますが、アドバイスなど頂戴できれば幸いです。 お忙しいなか恐縮ですが、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • HTMLをPHPでJSONにして返すには

    jqueryでurlをPHPに送って、そのurlのhtmlファイルから、titleタグやh1タグの内容を抽出し、連想配列に格納。そして、その連想配列をJSON形式にしてjqueryに返し、htmlにレンダリングしたいのですが上手くいきません。 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> function site_check(){ var url = $("#url").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURIComponent(url) ,function(res){ $("#title").html(res.title); $("#h1").html(res.h1); }); } </script> </head> <body> <div class="form"> URL <input type="text" id="url" value="" style="width:300px;" onfocus="this.select()" onkeypress="if(event.keyCode==13) site_check()" /> <button onclick="site_check()" />チェック</button> </div> title:<span id="title"></span></br> h1:<span id="h1"></span> </body> test.php↓ <?php $html=mb_convert_encoding(file_get_contents($_GET['url']), 'UTF-8', 'auto'); $array = array(); $pattern = "/(?<=<title>).+?(?=<\/title>)/mis"; preg_match($pattern,$html,$array['title']); $pattern = "/(?<=<h1>).+?(?=<\/h1>)/mis"; preg_match($pattern,$html,$array['h1']); header("Content-Type: application/json; charset=UTF-8"); echo json_encode($array); ?> このコードだと、test.phpからは、[object Object]と、レスポンスが返ってきてしまいます。

    • ベストアンサー
    • PHP
  • preg_replace()でマッチ文字列に関数を

    PHPでのpreg_replace()でマッチした文字列に関数を適用したいのですが、上手くいきません。 $str = "hogeHoge"; $pattern = '/(h.ge)/i'; $replacement = strtoupper("$1"); echo preg_replace($pattern, $replacement, $str); // 期待する結果 : HOGEHOGE // 実行した結果 : hogeHoge 根本的に間違っているかもしれませんが、ご指南いただければ幸いです。

    • ベストアンサー
    • PHP
  • 特定の要素を抜き取って連想配列へ

    例えば、 $hoge = "%_A_%あ%_A_%%_B_%123%_B_%%_C_%%_C_%%_D_%hogehoge%_D_%"; というようなデータがあった場合、 %_?_% の?部分を連想配列のキーとして、 そのはさまれた部分を前途キーの内容として格納したいのですが、 どのようにすればいいでしょうか? (%_?_%~%_?_% において?の組み合わせは必ず単一でしか存在しません) 求めている結果は $array['A'] => あ $array['B'] => 123 $array['C'] => //空要素 $array['D'] => hogehoge のような形です とりあえず if (preg_match("/%_([A-Z])_%(.*)%_$1_%/" , $hoge ,$matched) ){ // $matchedを解析して$arrayに割り当て } とすればいけるかな、と思いやってみましたがパターンマッチの条件にすら当てはまらず撃沈 preg_matchのマッチ条件内ではまだ$1が使えないようでした 環境はPHP4です よろしくお願いします

    • ベストアンサー
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP

専門家に質問してみよう