URLEncode变量从String解析为Array as3

时间:2012-02-16 08:47:31

标签: regex actionscript-3 parsing

确定!我有一个进入Flash的flashVar变量,它的URL编码但我已经解码了。我的问题是我希望将变量集推送到数组中。

假设变量是

  

“& text0 =输入文字...& size0 = 18& font0 = Arial& color0 = 0& rotation0 = 0& y0 = 360& x0 = 640& text1 = Enter   文本...&安培;尺寸1 = 18&安培; font1 = Arial字体&安培; COLOR1 = 0&安培; rotation1 = 0&安培; Y 1 = 360&安培; X 1 = 640"

依旧......

我想要的是进入数组的变量,如

myArray[0].text = Enter Text...
myArray[0].size = 18]
myArray[0].font = Arial
myArray[0].color = 0
myArray[0].rotation = 0
myArray[0].y = 360
myArray[0].x = 640
myArray[1].text = ...........
.............................
.............................
myArray[n].text = ...........

我认为必须有一些方法可以做到这一点。最有可能的是我正在思考正则表达式,但我在正则表达式上非常糟糕。请一些帮助非常非常赞赏。

谢谢!

3 个答案:

答案 0 :(得分:3)

您不必解码查询字符串,只需使用URLVariables对象 - 它将为您完成所有解码。然后迭代其动态属性以创建数组。使用RegExp查找变量键末尾的索引号:

function parseURLVariables( query:String ) : Array {
    var vars:URLVariables = new URLVariables (query);
    var arr:Array = [];
    for (var key : String in vars) {
        var splitIndex : int = key.search(/[0-9]+$/);
        var name:String = key.substr (0,splitIndex);
        var indexNumber:int = parseInt ( key.substr(splitIndex));
        arr[indexNumber] ||= {};
        arr[indexNumber][name] = vars[key];
    }
    return arr; 
}

由于您的查询字符串以&符号开头,您可能必须使用parseURLVariables ( myString.substr(1)),否则URLVariables对象将抛出错误,抱怨查询字符串无效(必须进行url编码,以及从变量键开始。)

答案 1 :(得分:0)

你可以使用string的split方法来做这样的事情;

var astrKeyValue: Array = url.Split( "&" );

这样astrKeyValue中的每个值都是字符串键值(例如font1=Arial) 之后,您可以使用“=”拆分每个项目,并获得对键和值(对于键 - font1和值 - arial) 所以这段代码可能适合你

var str = "text0=Enter Text...&size0=18&font0=Arial&color0=0&rotation0=0&y0=360&x0=640&text1=Enter Text...&size1=18&font1=Arial&color1=0&rotation1=0&y1=360&x1=640"
var a : Array = str.split( "&" );
var newArr: Array = new Array()
for each ( var str1 in a )
{
    var t: Array = str1.split( "=" );
    newArr[ t[0] ] = t[1];
}

trace( newArr.text0 ) // -> Enter Text...

答案 2 :(得分:0)

以下是我的解决方案,

//your string data should be like this, there should be a seperate seperator (i've used pipe sign |) for each element which will be converted to an object and then pushed to the array
var strData:String = "text=Enter Text...&size=18&font=Arial&color=0&rotation=0&y=360&x=640|text=Enter Text...&size=18&font=Arial&color=0&rotation=0&y=360&x=640";

var myArray:Array = new Array();
var _tmpArr:Array = strData.split("|");

//populating the array
for(var i:int=0;i<_tmpArr.length;i++)
{
    myArray.push(strToObj(_tmpArr[i]));
}
trace(myArray.length);

// coverts chunk of string to object with all key and value in it
function strToObj(str:String):Object
{
    var obj:Object = new Object();
    var tmpArr:Array = str.split('&');

    for (var i:int = 0; i < tmpArr.length; i++)
    {
        var _arr:Array = String(tmpArr[i]).split('=');
        var key:String = String(_arr[0]);
        var val:String = String(_arr[1]);
        obj[key] = val;
        trace(key+" = "+val);
    }
    trace("----");
    return obj;
}