preg_match()を使ってhtmlタグを抽出
この記事は2008年6月に公開したものです(18年以上前)。当時の情報にもとづいており、現在の仕様とは異なる場合があります。
こんばんわ。
早坂@magicalです。
今日はpreg_match関数について述べていきたいと思います。
preg_matchはマッチングを検出する関数(ちょっと違うかも・・・)です。
ある特定のパターンに一致したらTRUE(真)または、配列を返します。
ではでは、例題でhtmlを配列に入れて、それを1文化し、マッチングを検証したいと思います。(改行も取ります)
PHP4、PHP5で動くと思います。
[php]
< ?
$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( "/
print_r( $matches ); //配列を出力しています。
?>
[/php]
これでhtmlのタイトルを取得することが出来ます。
マッチパターンを見てみましょう。
「”/<title>(.*?)</title>/i“」
みただけでは分かりませんよね。
何をしているかというと、「i」は大文字小文字関係なくマッチパターンにマッチする箇所を探します。
「(.*?)」は最短マッチと呼ばれるものです。
例えば、こんなことはあの例のhtml生成ソフトくらいにしかないと思われますが、
「タイトルタグがなぜ2つ」
というときがあったとします。
「<title>タイトル1</title><title>タイトル2</title>」
なんとなーくわかってきたとは思いますが、「最短距離で</title>にマッチした箇所までを抽出する」ようになっています。
最短距離というのは、「<title>」が始まってから、「</title>」で終わるまでの距離(文字数といえばいいのかなぁ。。)が一番短いときのことです。
分かってもらえたでしょうか??
なんというか上手く説明できずにすみません。
これと同様にbodyタグ以下を抽出したり、抽出したタグを削除したりといろいろ出来ます。
しかし最悪な状態が起きる場合もあります。
メモリオーバーフローです。
preg_march関数はただでさえ重い関数です(使い方によっては軽くなります。肯定先読みとかいろいろあります。)
使う際は十分注意して使用してください。
では、今日はこれにて失礼します。
ウェブサイトの制作・改善や、社内の困りごとのご相談を承っています。
相談してみる