7

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

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

...ETC

我想把它剥离成一个数组,读取 myid1, myitem1, myid2, myitem2, ....etc

永远不会有嵌套元素,因此不存在递归嵌套问题。任何人都可以快速解决这个问题?谢谢你的帮助!

4

4 回答 4

10

这是一个正则表达式:

  • 匹配开始和结束标记元素名称
  • 提取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"
}

如果 <item> 元素包含嵌套的 HTML,则为 YMMV。

于 2010-07-17T11:11:08.293 回答
3

如果有人真的喜欢或需要使用 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);
}
于 2016-01-21T10:11:38.353 回答
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];
    }
}
于 2010-07-17T10:33:24.520 回答
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") ;

    }

然后使用上面的脚本。

于 2010-07-17T11:01:41.607 回答