preg_match()を使ってhtmlタグを抽出

こんばんわ。

早坂@magicalです。

今日はpreg_match関数について述べていきたいと思います。

preg_matchはマッチングを検出する関数(ちょっと違うかも・・・)です。

ある特定のパターンに一致したらTRUE(真)または、配列を返します。

ではでは、例題でhtmlを配列に入れて、それを1文化し、マッチングを検証したいと思います。(改行も取ります)

PHP4、PHP5で動くと思います。

< ?
$source = file( "http://www.magical-remix.co.jp" ); // ソース取得
$rfSource =& $source ; // 重いので参照させるように
unset( source ); //メモリ開放

$implodeSource =& implode( "", $rfSource ) ; // 1文化します

$trimSource =& preg_replace( "/(n|r|t)/", "", $implodeSource ); // 改行、タブ文字を取り除きます

preg_match( &quot;/<title>(.*?)</title>/i", $trimSource, $matches ) ; // タイトルにマッチングさせ、$matchesに格納します
print_r( $matches ); //配列を出力しています。
?&gt;

これでhtmlのタイトルを取得することが出来ます。

マッチパターンを見てみましょう。

「”/<title>(.*?)</title>/i“」

みただけでは分かりませんよね。

何をしているかというと、「i」は大文字小文字関係なくマッチパターンにマッチする箇所を探します。

「(.*?)」は最短マッチと呼ばれるものです。

例えば、こんなことはあの例のhtml生成ソフトくらいにしかないと思われますが、

タイトルタグがなぜ2つ

というときがあったとします。

<title>タイトル1</title><title>タイトル2</title>

なんとなーくわかってきたとは思いますが、「最短距離で</title>にマッチした箇所までを抽出する」ようになっています。

最短距離というのは、「<title>」が始まってから、「</title>」で終わるまでの距離(文字数といえばいいのかなぁ。。)が一番短いときのことです。

分かってもらえたでしょうか??

なんというか上手く説明できずにすみません。

これと同様にbodyタグ以下を抽出したり、抽出したタグを削除したりといろいろ出来ます。

しかし最悪な状態が起きる場合もあります。

メモリオーバーフローです。
preg_march関数はただでさえ重い関数です(使い方によっては軽くなります。肯定先読みとかいろいろあります。)

使う際は十分注意して使用してください。

では、今日はこれにて失礼します。