• 締切済み

正規表現で特定のHTMLタグのクラスから文字列を取り出したい

はじめまして。 現在PHP勉強中の者です。 タイトル通りクラス付けされたHTMLタグ内の文字列を取り出したいのですが、上手くいかず困ってます。 利用サーバーはコアサーバーで環境は下記通りになります。 apache:1.3.37 PHP:5.2.5 スクリプトはUTF-8、HTMLもUTF-8です。 タグは<span class="hoge">文字列</span> のような感じです。 preg_match_all("/<span class=\"hoge\">(.*)</span><\/em>/", $html, $results); こんな感じでやってるんですが引っ掛かりません。。。 よろしくお願いします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

途中改行対応なら preg_match_all("/<span class=\"hoge\">(.*?)<\/span>/s", $html, $results); でいけます

starland
質問者

お礼

yambejpさん ご回答ありがとうございます。 preg_match_all("/<span class=\"hoge\">(.*?)<\/span>/s", $html, $results); でいけますね。 パターン修飾子にUオプションをつけてやってみてもOKでしたpreg_match_all("/<span class=\"hoge\">(.*)<\/span>/sU", $html, $results); この場合最小マッチ?を抜いてます。 本家マニュアルhttp://jp.php.net/manual/ja/reference.pcre.pattern.modifiers.php を見てみると、 U (PCRE_UNGREEDY) この修飾子を設定すると、量指定子の「貪欲さ」が反転します。 つまり、量指定子は、デフォルトで貪欲でなく、 疑問符を後ろに付けてはじめて貪欲になるようになります。 この修飾子は Perl 互換では有りません。 同様の設定は、(?U) 修飾子を パターン内で設定 するか、(.*? のように)量指定子の後に疑問符を 付けるかすることで行うこともできます。 という事でこの二つの方法結局意味はほぼ一緒? 少しずつ正規表現がわかってきて面白くなってきましたがまだまだ覚えることが沢山ありますね。。。 この事案とは別にフォームでURLの正規表現チェックを作ったのですが存在するURLでもマッチングしなかったり・・・ こんな場合は実際URLが存在するかを調べた方がよいのですかね? PHPの正規表現でオススメの参考書等ありましたらご教授頂けると助かります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

とりあえずtypoの修正と最小マッチを指定すれば少しよくなります。 <? $html=<<<eof これは<span class="hoge">文字列1</span>です。これは<span class="hoge">文字列2</span>です。 eof; preg_match_all("/<span class=\"hoge\">(.*?)<\/span>/", $html, $results); print_r($results); ?>

starland
質問者

お礼

yambejpさん ご回答ありがとうございます。 確かに例文通りの$htmlでは最小マッチ指定でマッチングしますね。 ただ改行(\n)などが入ってる場合はマッチングしてくれないです。 <?php $html=<<<eof これは<span class="hoge">文字列1 </span>です。これは<span class="hoge">文字列2</span>です。 eof; preg_match_all("/<span class=\"hoge\">(.*?)<\/span>/", $html, $results); print_r($results[1]); /* Array ( [0] => 文字列2 ) */ ?> パターン修飾子を使用したり色々やってみます。

  • 4017B
  • ベストアンサー率73% (1336/1814)
回答No.1

正規表現のミス?? × preg_match_all("/<span class=\"hoge\">(.*)</span><\/em>/", $html, $results); ○ preg_match_all("/<span class=\"hoge\">(.+)<\/span>/", $html, $results); phpは門外漢ですが、こう言う事でわ…?

starland
質問者

お礼

4017Bさん ゴメンナサイ ただの記述ミスです。。。 preg_match_all("/<span class=\"hoge\">(.+)<\/span>/", $html, $results); という事で上記でもマッチング行えません。 ご指摘ありがとうございました。

関連するQ&A