正規表現でのマッチを複数取得したい

このQ&Aのポイント
  • 正規表現にて、文字列のhtmlタグ部のみを配列にして取得したいのですが、初めにマッチする1つしか返り値を取得できません。
  • preg_match関数を使用してマッチした後も続けて検索するためには、オプション'g'を使うことができますが、エラーが出てしまいます。
  • 解決策をご存じの方はいらっしゃいませんか?ご教示いただけると幸いです!
回答を見る
  • ベストアンサー

正規表現でのマッチを複数取得したい

正規表現にて、文字列のhtmlタグ部のみを配列にして取得したいのですが、初めにマッチする1つしか返り値を取得できません。 ----ソース--------------------- $this->target_str <<<EOS <test1>aaa</test1> <test2>bbb</test2> EOS; preg_match ( "/<.*?>/imsu" , $this->target_str, $RES_ARR ); ------------------------------- 上の例だと、 $RES_ARR[0] => "<test1>" となり、残りのタグは取得できないのです。 google検索にて発見した、'マッチした後も続けて検索する'というオプション'g'をつけてみたのですが、'g'に対してエラーが出てしまいます。 どなたか解決策をお持ちの方いらっしゃいましたらよろしくお願いします!

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

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

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

preg_matchではなく、preg_match_allを使います 例 preg_match_all ( "/<.*?>/" , $this->target_str, $RES_ARR );

関連するQ&A

  • 正規表現でpreg_系を使ってタグ内は置き換えないようにする方法

    正規表現でpreg_系を使って、半角スペースを&nbsp;に置き換える処理をしたのですが、タグ内のスペースも&nbs;に置き換わってしましました。 タグ内は置き換えないようにするにはどのようにしたら良いでしょうか? データは複数行渡っています。以下はタグが置き換わるので、逆にタグでないものを置き換えたいです。 <?php function test_call($matches){ return str_replace(" ","&nbsp;",$matches[0]); } $data = <<< EOT この横は変換 します。 <a href="http://www.yahoo.co.jp/" target="_blank">タグの半角スペースは変換せず、 この横は変換する。 </a> このタグも変換してはいけません。< br/> EOT; $data = preg_replace_callback('/<("[^"]*"|\'[^\']*\'|[^>])*>[ ]?/', "test_call", $data); var_dump($data); ?>

    • ベストアンサー
    • PHP
  • (/)以降を取得する

    $img = "<img src=\"test/aaa.jpg\">"; $res = array(); if(preg_match_all('/<img[^>]*src="([^"]+)[^>]*>/', $img,$res)){ print "<pre>"; print_r($res); print "</pre>"; } imgタグを検索し、imgタグがあった場合(/)以降のみ 取得したいのですが、そのような事は可能でしょうか? お分かりになる方よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現で文字列の抜き出し

    PHP4で、文字列の中からマッチしたものを抜き出したいのですが、なかなか上手いこといきません。 $str = "<a href=http://www.abc.com/><b>ABC</b>company</a>"; preg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg); http://www.abc.com/ と <b>ABC</b>company の2つを抜き出したいのですが、 <b>タグが邪魔をして抜き出せません。 どうすれば上記2つを抜き出せるのでしょうか?

    • ベストアンサー
    • PHP
  • サイト内検索で複数の言葉にマッチさせるには

    簡素な検索エンジンを作りたいんですが 複数の言葉にマッチする仕組みが作れなくて困っています たとえば 検索したい文が$str 複数のキーワードが$key=array("AAA","BBB",....)だったとして for($j=0;$j<count($key);$j++){ if(mb_ereg_match("$key[$j]",$str)){print "HIT";} } だと只のor検索、$keyの中身を(AAA|BBB|...)の形に変えてpreg_matchさせても当然or検索 なにか複数の単語にマッチさせる方法はありませんでしょうか?

    • 締切済み
    • PHP
  • 正規表現:文字列の最後にマッチした文字以外を取得

    phpを使って、正規表現と関数で文字列の編集を行っているのですが いい方法が思いつきません。 やりたいことは以下のようなことです。 $find ="\n"//マッチさせたい文字 $string = "リンゴ、空、\nミルク、車\n";//検索対象 $str=関数($string);//わからない部分 print($str); ↓表示結果 リンゴ、空、\nミルク、車 文字列のインデックスの0から、最後にマッチした文字列の直前までを取得するにはどうしたらよいでしょうか。 またこのような表現には何か名前がついていますか? ご教授ください。

    • ベストアンサー
    • PHP
  • preg_matchの正規表現がうまくいかない

    たとえば、http://gehasoku.com/?p=2のソースコードには ------------------- <rdf:Description rdf:about="http://www.com/aaa.html" trackback:ping="http://www.com" dc:title="タイトル" dc:identifier="http://iii.com/bbb.html" dc:subject="ハードウェア" dc:description="1 名前:名無しさん " dc:creator="soft_net" dc:date="2012-02-21T20:05:01+09:00" /> ------------------- のような形の<rdf:Description~~~/>タグの情報ががいくつかあると思います。これらすべてを文字列として取得したくて、次のようなphpを作成しましたが、うまく動作しません。 原因はどうやらpreg_match_allの正規表現がうまくいっていないからのようですので、 <rdf:Description~~~/>を抜き出すことができる正規表現を教えてください。 自分でもここでチェックしながらやりましたが、 http://www.rider-n.sakura.ne.jp/regexp/regexp.php <rdf:Description~をマッチすることはできても、/>で閉じることができませんでした。 よろしくお願いします。 <?php $url="http://gehasoku.com/?p=2"; $html=file_get_contents($urls); preg_match_all("/<rdf:Description(.*)?\/>/",$html,$match); print_r($match); foreach($match[1] as $value){ echo $value; } ?>

    • ベストアンサー
    • PHP
  • UTF-8サイトを取得しSJISに

    以下のPHPで指定のサイトを取得すると文字化けしてしまいます。 何処が悪いのか分かる方、ご指導お願い致します。 <?php $str = file_get_contents('http://esthe-cinderellaesthe.on.omisenomikata.jp/diary'); mb_convert_encoding($str,"SJIS","UTF-8"); if (preg_match('!<div id="content">(.*?)<div class="pr">!s', $str, $res)){ print $res[1]; } ?>

    • ベストアンサー
    • PHP
  • 複数回のパターンマッチ

    どうしても複数回のパターンマッチで値が取得できません。 すべてを配列などに代入したのですがどうすればよいのでしょうか? 下記のような感じです。 $str = <<EOF <a>dasfdaf</a><br> asfdafdsa sfatyuytu <a>jkytr</a><br> gjetjt tyurtyu EOF ; if ($str =~ /<a>(.*)<\/a><br>/g) { @list = $1; } よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 文字列と配列の振る舞いの違いについて

    以下のコードで出るalertが Array => 12 String => 2 となります。この原因といいますか原理をご存じでしたら教えていただけませんでしょうか。お願いします。 =========================================================== var test = function(name){ this.arr.push(name); this.str += name; } test.prototype = { arr:[], str:"" } var r = new test("1"); var z = new test("2"); alert("Array => " + z.arr.join("") + "\nString => " + z.str);

  • js 正規表現

    下記のhtmlをinnerHTMLで取得しました。センチメートルからtd閉じタグの<の一つ前までの文字を削除したいです。str.replace(/セ.+</g<, ''<") こちらを試しましたが削除できませんでした。 よろしくお願いします。 "<td>22センチメートル 234234; ? (概算)34 </td> <td>23センチメートル 234234; ? (概算)93 </td> <td>24センチメートル 234234; ? (概算)645fail </td> <td>25センチメートル 234234; ? (概算)627 </td>"

専門家に質問してみよう