2010-07-17 120 views
3

嘿我想在javascript中使用正则表达式做一些特定的事情,我的regexp-foo是最好的shakey。想知道是否有专业人士可以指引我走向正确的方向。所以,我有一些文字...正则表达式来寻找标签ID和内容JavaScript

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

...等

而且我想剥离出来到一个数组中读取 myid1,myitem1,myid2,myitem2,....等

永远不会有嵌套元素,所以没有递归嵌套问题。任何人都可以迅速将其赶出去? 感谢您的帮助!

+0

你能写一个关于myitem1 myitem2等结构的更好的解释,还是它是一个简单的空格分隔的字符串列表? – kzh 2010-07-17 10:21:20

回答

5

这里有一个正则表达式将:

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

因人而异,如果<项目>元素包含嵌套的HTML。

+2

太好了,谢谢!改变重新成为.../] * id = [“'](。*?)['']>(。*?)<\/item>/gi并且似乎适用于:-) – Thomas 2010-07-17 14:26:41

+0

谢谢@Thomas和克里斯,这帮人'''id = myID>(。*?)<\/tag>''' – Florida 2015-08-10 08:02:35

0

我一直用这个网站来建立我的正则表达式:

http://www.pagecolumn.com/tool/regtest.htm

这是我想出了正则表达式:

(<[^>]+>)([^<]+)(<[^>]+>) 

这是结果页面给我的JavaScript

使用RegEx p对象:

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]; 
    } 
} 
0

这是一个XML字符串。 A 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") ; 

    } 

然后使用上面的脚本。

+0

使用xml解析器将是理想的解决方案,但不幸的是,我无法访问dom操作,这对这个问题有点矫枉过正。虽然谢谢! – Thomas 2010-07-17 14:24:53

+0

那么,在我的情况下,提出一个正则表达式模式将会持续更长的时间。另外,由于您有XML字符串,因此您可以通过构建DOM对象来访问,如上所述。无论如何,不​​客气! – FK82 2010-07-17 16:20:14

1

如果真的有人喜欢或需要使用正则表达式的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); 
}