嘿我正在尝试用javascript中的正则表达式做一些非常具体的事情,而我的regexp-foo充其量只是shakey。想知道是否有任何专业人士可以指出我正确的方向。所以我有一些文字......
<item id="myid1">myitem1</item>
<item id="myid2">myitem2</item>
...等
我想把它删除成一个读取的数组 myid1,myitem1,myid2,myitem2,....等
永远不会有嵌套元素,因此没有递归嵌套问题。有人能够迅速将其击败吗? 谢谢你的帮助!
答案 0 :(得分:7)
这是一个正则表达式:
注意: 我在这里匹配属性值时很懒。它需要用双引号括起来,属性名和它的值之间不能有空格。
<([^\s]+).*?id="([^"]*?)".*?>(.+?)</\1>
在javascript中运行正则表达式就像这样:
search = '<item id="item1">firstItem</item><item id="item2">secondItem</item>';
regex = new RegExp(/<([^\s]+).*?id="([^"]*?)".*?>(.+?)<\/\1>/gi);
matches = search.match(regex);
results = {};
for (i in matches) {
parts = regex.exec(matches[i]);
results[parts[2]] = parts[3];
}
在此结束时,results
将是一个看起来像的对象:
{
"item1": "firstItem",
"item2": "secondItem"
}
YMMV如果&lt; item&gt;元素包含嵌套的HTML。
答案 1 :(得分:1)
如果有人真的喜欢或需要使用Regex来获取id的HTML标签(就像问题主题中那样),他可以使用我的代码:
function GetTagByIdUsingRegex(tag,id,html) {
return new RegExp("<" + tag + "[^>]*id[\\s]?=[\\s]?['\"]" + id + "['\"][\\s\\S]*?<\/" + tag + ">").exec(html);
}
我也做了一个按类名获取元素:
function GetTagByClassUsingRegex(tag,cls,html) {
return new RegExp("<" + tag + "[^>]*class[\\s]?=[\\s]?['\"]" + cls + "[^'\"]*['\"][\\s\\S]*?<\/" + tag + ">").exec(html);
}
答案 2 :(得分:0)
我总是使用这个网站来构建我的正则表达式:
http://www.pagecolumn.com/tool/regtest.htm
这是我想出的正则表达式:
(<[^>]+>)([^<]+)(<[^>]+>)
这就是该页面为我提供JavaScript
的结果使用RegExp对象:
var str = "<item id="myid1">myitem1</item><item id="myid2">myitem2</item><ssdad<sdasda><>dfsf";
var re = new RegExp("(<[^>]+>)([^<]+)(<[^>]+>)", "g");
var myArray = str.match(re);
使用文字:
var myArray = str.match(/(<[^>]+>)([^<]+)(<[^>]+>)/g)
if ( myArray != null) {
for ( i = 0; i < myArray.length; i++ ) {
var result = "myArray[" + i + "] = " + myArray[i];
}
}
答案 3 :(得分:0)
这是一个xml字符串。在我看来, XML解析器似乎最适合这种任务。执行以下操作:
var items = document.getElementsByTagName("item") ; //<> use the parent element if document is not
var dataArray = [ ] ;
for(var n = 0 ; n < items.length ; n++) {
var id = items[n].id ;
var text = items[n].childNodes[0] ;
dataArray.push(id,text) ;
}
如果您的问题是您无法将xml字符串转换为xml对象,则必须事先使用 DOM解析器:
var xmlString = "" ; //!! your xml string
var document = null ;
if (window.ActiveXObject) { //!! for internet explorer
document = new ActiveXObject("Microsoft.XMLDOM") ;
document.async = "false" ;
document.loadXML(xmlString) ;
} else { //!! for everything else
var parser = new DOMParser() ;
document = parser.parseFromString(xmlString,"text/xml") ;
}
然后使用上面的脚本。