dポイントプレゼントキャンペーン実施中!

はじめまして。
現在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);

こんな感じでやってるんですが引っ掛かりません。。。

よろしくお願いします。

A 回答 (3件)

途中改行対応なら



preg_match_all("/<span class=\"hoge\">(.*?)<\/span>/s", $html, $results);

でいけます
    • good
    • 1
この回答へのお礼

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.patte …
を見てみると、
U (PCRE_UNGREEDY)
この修飾子を設定すると、量指定子の「貪欲さ」が反転します。 つまり、量指定子は、デフォルトで貪欲でなく、 疑問符を後ろに付けてはじめて貪欲になるようになります。 この修飾子は Perl 互換では有りません。 同様の設定は、(?U) 修飾子を パターン内で設定 するか、(.*? のように)量指定子の後に疑問符を 付けるかすることで行うこともできます。

という事でこの二つの方法結局意味はほぼ一緒?

少しずつ正規表現がわかってきて面白くなってきましたがまだまだ覚えることが沢山ありますね。。。

この事案とは別にフォームでURLの正規表現チェックを作ったのですが存在するURLでもマッチングしなかったり・・・
こんな場合は実際URLが存在するかを調べた方がよいのですかね?

PHPの正規表現でオススメの参考書等ありましたらご教授頂けると助かります。

お礼日時:2009/06/25 03:03

とりあえず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);
?>
    • good
    • 1
この回答へのお礼

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
)
*/
?>

パターン修飾子を使用したり色々やってみます。

お礼日時:2009/06/24 16:01

正規表現のミス??



× preg_match_all("/<span class=\"hoge\">(.*)</span><\/em>/", $html, $results);

○ preg_match_all("/<span class=\"hoge\">(.+)<\/span>/", $html, $results);

phpは門外漢ですが、こう言う事でわ…?
    • good
    • 0
この回答へのお礼

4017Bさん

ゴメンナサイ
ただの記述ミスです。。。

preg_match_all("/<span class=\"hoge\">(.+)<\/span>/", $html, $results);
という事で上記でもマッチング行えません。

ご指摘ありがとうございました。

お礼日時:2009/06/24 15:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!