Revision: 62059
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 31, 2013 10:42 by ryanve
Initial Code
/**
* Parse an attributes string into an array. If the string starts with a tag,
* then the attributes on the first tag are parsed. This parses via a manual
* loop and is designed to be safer than using DOMDocument.
*
* @param string|* $attrs
* @return array
*
* @example parse_attrs( 'src="example.jpg" alt="example"' )
* @example parse_attrs( '<img src="example.jpg" alt="example">' )
* @example parse_attrs( '<a href="example"></a>' )
* @example parse_attrs( '<a href="example">' )
*/
function parse_attrs ($attrs) {
if ( ! \is_scalar($attrs) )
return (array) $attrs;
$attrs = \str_split( \trim($attrs) );
if ( '<' === $attrs[0] ) # looks like a tag so strip the tagname
while ( $attrs && ! \ctype_space($attrs[0]) && $attrs[0] !== '>' )
\array_shift($attrs);
$arr = array(); # output
$name = ''; # for the current attr being parsed
$value = ''; # for the current attr being parsed
$mode = 0; # whether current char is part of the name (-), the value (+), or neither (0)
$stop = false; # delimiter for the current $value being parsed
$space = ' '; # a single space
foreach ( $attrs as $j => $curr ) {
if ( $mode < 0 ) {# name
if ( '=' === $curr ) {
$mode = 1;
$stop = false;
} elseif ( '>' === $curr ) {
'' === $name or $arr[ $name ] = $value;
break;
} elseif ( ! \ctype_space($curr) ) {
if ( \ctype_space( $attrs[ $j - 1 ] ) ) { # previous char
'' === $name or $arr[ $name ] = ''; # previous name
$name = $curr; # initiate new
} else {
$name .= $curr;
}
}
} elseif ( $mode > 0 ) {# value
if ( $stop === false ) {
if ( ! \ctype_space($curr) ) {
if ( '"' === $curr || "'" === $curr ) {
$value = '';
$stop = $curr;
} else {
$value = $curr;
$stop = $space;
}
}
} elseif ( $stop === $space ? \ctype_space($curr) : $curr === $stop ) {
$arr[ $name ] = $value;
$mode = 0;
$name = $value = '';
} else {
$value .= $curr;
}
} else {# neither
if ( '>' === $curr )
break;
if ( ! \ctype_space( $curr ) ) {
# initiate
$name = $curr;
$mode = -1;
}
}
}
# incl the final pair if it was quoteless
'' === $name or $arr[ $name ] = $value;
return $arr;
}
Initial URL
http://dev.airve.com/demo/speed_tests/php/parse_attrs.php
Initial Description
Parse an attributes string into an array. If the string starts with a tag, then the attributes on the first tag are parsed. This parses via a manual loop and is designed to be safer than using DOMDocument.
Initial Title
Parse Attributes
Initial Tags
Initial Language
PHP