我创建了一个执行此操作的函数。
var text="adsf [name]Victor[/name] dummytext [name]Elliot[/name] asdf [name]Jake[/name] asdf [foo]bar[/foo]";
alert( readTags(text,'name') ); //Victor,Elliot,Jake
alert( readTags(text,'foo') ); //bar
但现在我想实现一个接收像这样的字符串的函数
[person]
[name]jake[/name]
[age]12[/age]
[/person]
并返回一个像这样的对象
var object={};
object['person']={};
object['name']='jake';
object['age']='12';
return(object);
但我不知道如何遍历文本。如何处理开始和结束标签? 像
[tag] [tag]value[/tag] [/tag]
我想使用indexOf('[tag]')
和lastindexOf('[/tag]')
但在这种情况下不起作用
[tag]value[/tag] [tag]value[/tag]
这是上一个功能
function readTags(str,property){
var beginTag='['+property+']';
var endTag='[/'+property+']';
var values=new Array(0);
while(str.indexOf(beginTag)!=-1){
values[values.length]=strBetween(str,beginTag,endTag);
str=str.substring(str.indexOf(endTag)+endTag.length);
}
return(values);
}
function strBetween(string,strBegin,strEnd){ //StrBetween("abcdef","b","e") //return "cd"
var posBegin, posEnd;
posBegin=string.indexOf(strBegin);
string=string.substring(posBegin + strBegin.length);
posEnd=string.indexOf(strEnd);
string=string.substring(0,posEnd);
if ((posBegin==-1)||(posEnd==-1)){
return(null);
}else{
return(string);
}
}
答案 0 :(得分:4)
除非您有充分理由 使用JSON,否则请勿执行此操作。 JSON可以很好地处理所有这些问题,并且可以很容易地从服务器到客户端,反之亦然。
但是因为这看起来很有趣,我会试着看看我能不能给出答案。
由于您的结构类似于XML,只需将括号替换为<
和>
并将其解析为XML:
text = text.replace('[', '<').replace(']', '>');
if (typeof DOMParser != "undefined") {
var parser = new DOMParser();
var xml = parser.parseFromString(text, 'text/xml');
} else {
var xml = new ActiveXObject('Microsoft.XMLDOM');
xml.async = 'false';
xml.loadXML(text);
}
现在xml
拥有您可以解析的DOMDocument
:
xml.getElementsByTagName('person').childnodes;
尝试这个可能正常工作的代码(没有测试):
function createObject(element) {
var object = {};
if (element.childNodes.length > 0) {
for (child in element.childnodes) {
object[element.tagName] = createObject(child);
}
return object;
} else {
return element.nodeValue;
}
}
答案 1 :(得分:1)
我认为没有第三方解析器会很有趣,所以我为我构建了一个简单的解析器:
function parse(code)
{
var obj = {},
cur = obj,
stack = [];
code.replace(/\[([^\]]+)\]|([^\[]*)/g, function (match, tagName, text) {
if (tagName)
{
if (tagName.charAt(0) == "/")
{
/* end tag */
cur = stack.pop();
}
else
{
/* start tag */
stack.push(cur);
cur = cur[tagName] = {};
}
}
else
{
cur["#text"] = text;
}
});
return obj;
}
var obj = parse(text);
答案 2 :(得分:0)
JSON&lt; =&gt; XML http://code.google.com/p/x2js/