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