2009-06-23 67 views
0

我有一個XHTML文檔中的以下內容:什麼正則表達式可以匹配這些數據?

<script type="text/javascript" id="JSBALLOONS"> 
    function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
</script> 

我想在這兩個腳本標記之間進行選擇的一切。如果有幫助,id將永遠是JSBALLOONS。我知道如何選擇包含腳本標籤的內容,但我不知道如何選擇不包含腳本標籤的內容。正則表達式的結果應該是:

function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
+1

您好,我的感謝已被版主刪除!?!僅供參考,本文末尾包括:謝謝,皮特。我不喜歡主持人挑剔我的帖子,特別是取消我的禮貌。 – slypete 2009-06-23 18:27:10

回答

8

(更新後專門爲一個JavaScript解決方案。)

在Javascript中,你的代碼可能是這樣的:

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) { 
    inner_script = RegExp.$1; 
} 

那圓括號([\S\s]*?)之間的部分由正則表達式引擎保存,找到匹配項後即可訪問。在Javascript中,您可以使用RegExp.$1來引用腳本標記內的匹配部分。如果您有多個這樣的羣組,您可以用()包圍它們,您可以使用RegExp.$2,依此類推,最多RegExp.$9

默認情況下,Javascript不會匹配換行符,所以我們必須使用([\S\s]*?)而不是(.*?),這可能更有意義。如果您使用s修飾符(/.../s),則只需完成其他語言即可。

(我要補充一點,正則表達式刮HTML頁面類似這樣的內容時,通常是非常脆弱的。你可以使用jQuery框架的內容提取會更好。)

+0

嗨,謝謝。這正是我所擁有的,但它包含腳本標籤。你能解釋一下你的意思嗎?我不熟悉。謝謝! – slypete 2009-06-23 18:22:06

+0

@slypete,您使用哪種語言或工具來執行正則表達式? – molf 2009-06-23 18:24:48

+0

@molf,我使用JavaScript和jQuery。 var javascript = this.data.match(/ ] + id =「JSBALLOONS」>([\ S \ s] *?)<\/script>/ig); this.javascript = eval('('+ javascript +')'); – slypete 2009-06-23 18:28:36

2

什麼紳士指$ 1是「第一個捕獲組的價值」。當您將部分正則表達式括在圓括號中時,它定義了捕獲組。你從左到右數了它們。每個左括號開始一個新的捕獲組。它們可以嵌套。

(有方式來定義子表達式,而不限定捕獲基團的 - 我忘記語法)

在Perl中,$ 1是魔變量保持由第一捕獲組匹配的字符串,$ 2是匹配的字符串第二等。其他語言可能要求您在返回的匹配對象上調用方法以獲取第N個捕獲組。

但回到molf的解決方案。假如他說要使用這個模式來代替:

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/ 

在這種情況下,如果你有一個以上的腳本元素,這種不正確的模式將蠶食他們的所有,因爲它是貪婪的,值得說明的一點。此模式將從第一個開始標記開始,與其結束標記匹配,繼續前進,最後匹配最後一個標記。 molf解決方案中的神奇之處在於(。*?)中的問號,這使得它非貪婪。它會返回匹配模式的最短字符串,因此不會吞噬額外的腳本元素。

2

請勿嘗試對非正規語言使用正則表達式。正確的方法是使用XML解析器,在DOM:

document.getElementById("JSBALLOONS") 

編輯:關於你的評論,我有JavaScript或jQuery的沒有經驗,但經過一番搜索,我認爲這些方針的東西應該工作:

$.ajax({ 
    type: "GET", 
    url: "test.xml", 
    dataType: "xml", 
    success: function(xml) { 
    return $(xml).find("#JSBALLOONS").text(); 
    } 
}); 

燦有人更合格的糾正這一點?

0

foo是包含代碼的字符串。然後,您可以通過刪除封閉標籤

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<')) 
相關問題