• ベストアンサー

正規表現で文字列の抜き出し

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

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

  • ベストアンサー
  • sisya
  • ベストアンサー率39% (97/245)
回答No.2

最初のかっこはタグの終了を見ればいいわけですから 汎用性を考えると「.*」より「[^>]*」にすべきですよね? また、タグの要素は「""」で囲まれていることも多いので 以下のようにすると使い勝手が良いのではと思います。 /<a href=\"?([^>]*)\"?>(.*)<\/a>/ 未確認なので、間違ってたらごめんなさい。

その他の回答 (1)

回答No.1

preg_match("/<a href=(.*?)>(.*)<\/a>/i",$str,$str_reg); とか。 ひと文字加えただけ。

uyo_uyo
質問者

お礼

(.*?)だと、non-greedy(でしたっけ?)になるでしたね。参考になりました。ありがとうございます。

関連するQ&A

  • 正規表現の文字化け?で困っています。

    preg_matchで、条件を変数で定義したいのですが、うまくいきません。 すみませんが、教えてください。 $str = "hoge.php?a=10&b=3"; から"a=10"をマッチさせる場合。 preg_match('/^(.*(\?|&))(a=.*)(&.*)*$/', $str); で、一応うまくいきます。 マッチ条件を状況により変更させるため、まずは、 $con = "'/^(.*(\?|&))(a=.*)(&.*)*$/'"; preg_match($con, $str); のようにしたいのですが、なぜかマッチしてくれません。 すみませんが、対策方法の分かる方がいらっしゃましたら、ご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 正規表現 preg_match_all 

    $c = preg_match_all('@href="/Top/World/Japanese/(?P<query>.*?)">(?:<b>|)(?P<cate>.*?)(?:</b>|)</a>@s', $buf,$match,PREG_SET_ORDER); print_r($match); の(?:<b>|)と(?:</b>|)の部分がまちがっているので、<b></b>タグがあってもなくてもいい場合にマッチさせることができないと思っています。 どうか教えてくださいませ。 ちなみにPHPの5.2.2です。

    • ベストアンサー
    • PHP
  • 文字列全体に対する置き換え [正規表現]

    正規表現での文字列全体に対する、マッチ箇所 への置き換えについて、アドバイスをもらえないでしょうか。 parlでいうg修飾子はphpには無く、 例えば、[preg_match]は[preg_match_all]という関数で対応出来ますが、 置き換えを行う[preg_replace]には[preg_replace_all]がありません。 それに類する関数も無いように思います。 これに関して、PHPではどのように対応すれば良いのでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・

    • ベストアンサー
    • PHP
  • 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

    質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現での改行数を求めるにあたって

    以下の文字列がフォームからPOSTされたとします。 ------------------- 1 2 3 4 5 ------------------- ポストされた文字列が$strに格納されているとして、 以下を実行しました。 ------------------- print preg_match_all("[\n\r]", $str, $dummy); print preg_match_all("[\r\n]", $str, $dummy); print preg_match_all("[\r]", $str, $dummy); print preg_match_all("[\n]", $str, $dummy); ------------------- 結果はこうなりました。 ------------------- 6 6 10 10 ------------------- どうやらマッチパターンが"[\n\r]"と"[\r\n]"の場合は空白行の数を、 "[\r]"と"[\n]"の場合は純粋に改行数を返しているようです。 どうしてこのような差が出るのでしょうか? 文字コードはEUC、改行コードはLFで統一していますが関係ありますか?

    • 締切済み
    • PHP
  • 文字列中にURLを見つけたら、リンクとして出力したい

    お疲れ様です。 いつもお世話になっております。 私はPHP書きなので、PHPではすぐかけるのですが、今回はJSに埋め込まなければならないため、頭を抱えています。 PHPだとこういうことです---------------------------- preg_match_all('/(http(s?):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', $text, $delimiter); array_pop($delimiter); for( $i = 0;$i < count($delimiter[0]);$i++){ $text = str_replace($delimiter[0][$i], "<a href='{$delimiter[0][$i]}'>{$delimiter[0][$i]}</a>", $text); } --------------------------------------------ここまで たとえば var str = "今日は晴れだった。天気予報はhttp://www.jma.go.jp/jma/index.htmlで見られる。"; という文字列があった場合、 var str = "今日は晴れだった。天気予報は<a href="http://www.jma.go.jp/jma/index.html">http://www.jma.go.jp/jma/index.html</a>で見られる。"; と置換したいのです。(タグ回避のため<>は全角です) サンプルのURLは気象庁のページです。 str.match();で、一致させることはできるのですが、それをどうやって、タグでくるめばよいのかが分かりません。 解説しているサイトか、スクリプトを載せていただけると助かります。 よろしくお願いします。

  • 正規表現に関して

    httpがついていないリンクだけに絶対パスをつけたいのですがなかなかうまくいきません。 $data='<a href="1_4/abc.jpg">abc</a> <a href="aiueo/abc.jpg">abc</a> <a href="http://www.●●●.co.jp/4/123.jpg">123</a> '; 以上を↓に <a href="http://www.test.com/1_4/abc.jpg">abc</a> <a href="http://www.test.com/aiueo/abc.jpg">abc</a> <a href="http://www.●●●.co.jp/4/123.jpg">123</a> preg_replace ('/(href=\")+^(http)+?/mi','=\"http:\/\/test\.com\/',$data); で駄目でした。 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう