HTML文から特定のタグを抽出して分離するPHP関数を紹介します
但し、入れ子になったタグに関しては正しく処理出来ませんが、それなりに使い道はあるような気がします (^_^;)
目的としては、HTML文から script タグ文を抽出して分離させたいということです
当初はむか~しにすこしやった正規表現を使ってみようかと思ったのですが、すっかり忘れてしまい、特定のタグを抜き出すだけならそこまでは不要と思われたので、PHPの文字列処理 stripos と substr 関数を使用して実装してみました
作成した関数は2つです
HTML の指定タグ位置を取得
//HTML の指定タグ位置を取得(大文字、小文字を区別しない) // $html 検索するHTML文 // $stag スタートタグ 例 <script // $etag エンドタグ 例 /script> // $ofset検索開始位置 0- (strlen()-1) // 戻り値 位置情報配列(start, end) エラー時は FALSE public static function htmltagpos($html, $stag, $etag, $ofset=0) { $pos = FALSE; $start = stripos($html, $stag, $ofset); if($start !== FALSE){ $end = stripos($html, $etag, $start); if($end !== FALSE){ $end += (strlen($etag)-1); $pos = array($start, $end); } } return $pos; }
HTML の指定タグを取り除き分離します
//HTML の指定タグを分割して取り出す // $html 検索するHTML文 // $stag スタートタグ 例 <script // $etag エンドタグ 例 /script> // $ofset検索開始位置 0- (strlen()-1) // 戻り値 分割 HTML文配列 $newhtml(指定タグ以外の部分, 指定タグ1, 指定タグ2, --- 指定タグN) public static function htmltagsplit($html, $stag, $etag, $ofset=0) { $newhtml[0] = ''; if(strlen($html) > 0){ $start = $ofset; $end = strlen($html) - $ofset - 1; if($start != 0) $newhtml[0] = substr($html, 0, $start); for($cnt=0; ($pos = CeltisLib::htmltagpos($html, $stag, $etag, $start)) !== FALSE; $cnt++){ $newhtml[0] = $newhtml[0] . substr($html, $start, $pos[0] - $start); $len = $pos[1] - $pos[0] + 1; $newhtml[$cnt+1] = substr($html, $pos[0], $len); $start = $pos[1] + 1; } if($start < $end) $newhtml[0] = $newhtml[0] . substr($html, $start, $end - $start + 1); } return $newhtml; }
使用例
$newhtml = [スタティッククラス名]::htmltagsplit($html, ‘<script’, ‘/script>’);
HTML文と開始タグ、終了タグ、オフセット位置(省略時は0)を指定します
ここでは $html のHTML文から script タグを抽出してみます
結果は、指定タグを取り除き分離したHTML文の配列データが $newhtml にセットされます。配列の0番目が指定タグを取り除いたHTML文、以下順番に抽出したタグのHTML文が順番に配列にセットされています
(指定タグが存在しなければ、配列0に元のHTML文が入るだけです)
PHPのプログラムでは、文字列と配列の組み合わせるだけでも結構なパワーがあることが実感出来ます