正则表达式查找标记ID和内容JavaScript

时间:2010-07-17 10:18:02

标签: javascript regex elements

嘿我正在尝试用javascript中的正则表达式做一些非常具体的事情,而我的regexp-foo充其量只是shakey。想知道是否有任何专业人士可以指出我正确的方向。所以我有一些文字......

<item id="myid1">myitem1</item>
<item id="myid2">myitem2</item>

...等

我想把它删除成一个读取的数组 myid1,myitem1,myid2,myitem2,....等

永远不会有嵌套元素,因此没有递归嵌套问题。有人能够迅速将其击败吗? 谢谢你的帮助!

4 个答案:

答案 0 :(得分:7)

这是一个正则表达式:

  • 匹配起始和结束标记元素名称
  • 提取id属性的值
  • 提取标记的内部html内容

注意: 我在这里匹配属性值时很懒。它需要用双引号括起来,属性名和它的值之间不能有空格。

<([^\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") ;

    }

然后使用上面的脚本。