Parsed: 121108

function wp_kses_hair( $attr, $allowed_protocols ) {
  $attrarr  = array();
  $mode     = 0;
  $attrname = '';
  $uris     = wp_kses_uri_attributes();

  // Loop through the whole attribute list.

  while ( strlen( $attr ) !== 0 ) {
    $working = 0; // Was the last operation successful?

    switch ( $mode ) {
      case 0:
        if ( preg_match( '/^([_a-zA-Z][-_a-zA-Z0-9:.]*)/', $attr, $match ) ) {
          $attrname = $match[1];
          $working  = 1;
          $mode     = 1;
          $attr     = preg_replace( '/^[_a-zA-Z][-_a-zA-Z0-9:.]*/', '', $attr );
        }

        break;

      case 1:
        if ( preg_match( '/^\s*=\s*/', $attr ) ) { // Equals sign.
          $working = 1;
          $mode    = 2;
          $attr    = preg_replace( '/^\s*=\s*/', '', $attr );
          break;
        }

        if ( preg_match( '/^\s+/', $attr ) ) { // Valueless.
          $working = 1;
          $mode    = 0;

          if ( false === array_key_exists( $attrname, $attrarr ) ) {
            $attrarr[ $attrname ] = array(
              'name'  => $attrname,
              'value' => '',
              'whole' => $attrname,
              'vless' => 'y',
            );
          }

          $attr = preg_replace( '/^\s+/', '', $attr );
        }

        break;

      case 2:
        if ( preg_match( '%^"([^"]*)"(\s+|/?$)%', $attr, $match ) ) {
          // "value"
          $thisval = $match[1];
          if ( in_array( strtolower( $attrname ), $uris, true ) ) {
            $thisval = wp_kses_bad_protocol( $thisval, $allowed_protocols );
          }

          if ( false === array_key_exists( $attrname, $attrarr ) ) {
            $attrarr[ $attrname ] = array(
              'name'  => $attrname,
              'value' => $thisval,
              'whole' => "$attrname=\"$thisval\"",
              'vless' => 'n',
            );
          }

          $working = 1;
          $mode    = 0;
          $attr    = preg_replace( '/^"[^"]*"(\s+|$)/', '', $attr );
          break;
        }

        if ( preg_match( "%^'([^']*)'(\s+|/?$)%", $attr, $match ) ) {
          // 'value'
          $thisval = $match[1];
          if ( in_array( strtolower( $attrname ), $uris, true ) ) {
            $thisval = wp_kses_bad_protocol( $thisval, $allowed_protocols );
          }

          if ( false === array_key_exists( $attrname, $attrarr ) ) {
            $attrarr[ $attrname ] = array(
              'name'  => $attrname,
              'value' => $thisval,
              'whole' => "$attrname='$thisval'",
              'vless' => 'n',
            );
          }

          $working = 1;
          $mode    = 0;
          $attr    = preg_replace( "/^'[^']*'(\s+|$)/", '', $attr );
          break;
        }

        if ( preg_match( "%^([^\s\"']+)(\s+|/?$)%", $attr, $match ) ) {
          // value
          $thisval = $match[1];
          if ( in_array( strtolower( $attrname ), $uris, true ) ) {
            $thisval = wp_kses_bad_protocol( $thisval, $allowed_protocols );
          }

          if ( false === array_key_exists( $attrname, $attrarr ) ) {
            $attrarr[ $attrname ] = array(
              'name'  => $attrname,
              'value' => $thisval,
              'whole' => "$attrname=\"$thisval\"",
              'vless' => 'n',
            );
          }

          // We add quotes to conform to W3C's HTML spec.
          $working = 1;
          $mode    = 0;
          $attr    = preg_replace( "%^[^\s\"']+(\s+|$)%", '', $attr );
        }

        break;
    } // End switch.

    if ( 0 === $working ) { // Not well-formed, remove and try again.
      $attr = wp_kses_html_error( $attr );
      $mode = 0;
    }
  } // End while.

  if ( 1 === $mode && false === array_key_exists( $attrname, $attrarr ) ) {
    /*
		 * Special case, for when the attribute list ends with a valueless
		 * attribute like "selected".
		 */
    $attrarr[ $attrname ] = array(
      'name'  => $attrname,
      'value' => '',
      'whole' => $attrname,
      'vless' => 'y',
    );
  }

  return $attrarr;
}