2011年10月6日木曜日

PHP HTMLタグの属性をパースする

HTMLタグの属性をパースする関数を作って見ました。
//====================================================================
//! タグの属性をパースする
//! 属性名はアルファベット, 記号(-_), 数字を認めます。
//! 値は "' での括りを認めます。
//! @param string $str タグの属性文字列
//! 例 type=submit type="submit" type='submit' checked
//! @return array キーが属性名の配列
//====================================================================
function aryParseTagAttribute( $str )
{
 //=== 正規表現 ===================================================
// $ma の要素番号
//  1                2 34                  5 67                    8 9
 $re = <<<_EOL_
/\s*([A-Za-z0-9_\-]+)(=(([^"'][^\s]*[^"'])|('(([^'\\\\]|\\\\.)*)')|("(([^"\\\\]|\\\\.)*)")))?/
_EOL_;
 $iMatches = preg_match_all( $re, $str, $ma );

 $aryAttr = array( );
 for ( $i = 0; $i < $iMatches; ++ $i )
 {
  //=== 属性名 =================================================
  $strName = $ma[1][$i];

  //=== 値を取得 ===========================================
  // type="submit"
  // $ma[] は (かっこの順にサブ文字列を格納している
  if ( !empty( $ma[4][$i] ) )
   $strValue = $ma[4][$i]; // 括り無し
  else if ( !empty( $ma[6][$i] ) )
   $strValue = $ma[6][$i]; // '' 括り
  elseif ( !empty( $ma[9][$i] ) )
   $strValue = $ma[9][$i]; // "" 括り
  else
   $strValue = '';   // 値なし

  //============================================================
  $aryAttr[$strName] = $strValue;
 }

 //================================================================
 return $aryAttr;
}

◆テスト
$s = <<<_EOL_
type="text" name='DATE' onclick="func( '\"test\"' ); return" width=100
_EOL_;

$a = aryParseTagAttribute( $s );
print_r( $a );

◆実行結果
Array
(
    [type] => text
    [name] => DATE
    [onclick] => func( '\"test\"' ); return
    [width] => 100
)

0 件のコメント:

コメントを投稿