2010-07-17 118 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); 
}