HTMLのタグ属性文字列をJSON文字列化

例えば

以下の文字列を
foo="fooText" bar="barText" attr="attr's text"
以下のJSON文字列にしたい
{foo:"fooText",bar="barText",attr:'attr\'s text'}

昔は正規表現を利用していた。

正規表現を利用してループ処理して色々やってJSON文字列を作成していました(JSmartyのCompiler.jsのCompiler._attribute関数)。でも良く考えたら機械的に変換できるのでコード書き換えました。

というわけで以下のコード

function genAttrToJSONStr(s)
{
  var c, i, f, b = s.split('');
  for(i=0,f=s.length;i<=f;i++)
  {
    switch(b[i])
    {
      case ' ':
      case '\t':
      case '\r':
      case '\n':
        b[i++] = ',';
        while(b[i] <= ' ') b[i++] = '';
        break;
      case '=':
        b[i] = ':';
        break;
      case '"':
      case "'":
        c = b[i];
        while(b[++i] != c);
        if(b[i-1] == '\\') i--;
        break;
    };
  };

  return '{' + b.join('') + '}';
}
// {foo:"fooText",bar:"barText",attr:"attr's text"}
genAttrToJSONStr('foo="fooText" bar="barText" attr="attr\'s text"');
// {attr:false,param:'fo  " o',param:"foo"}
genAttrToJSONStr('attr=false param=\'fo  " o\'\n\n    param="foo"');

まぁ

JavaScriptでやる必然性はないよなと…。(注:処理が甘い部分あるので無限ループに陥る場合があります。)