//====================================================================
//! タグの属性をパースする
//! 属性名はアルファベット, 記号(-_), 数字を認めます。
//! 値は "' での括りを認めます。
//! @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 件のコメント:
コメントを投稿