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のプログラムでは、文字列と配列の組み合わせるだけでも結構なパワーがあることが実感出来ます