2008-12-01 72 views
2

我有以下非常簡單的JavaScript兼容的正則表達式:如何編寫正則表達式以便模式以任何順序出現?

<script type="text/javascript" id="(.+)" src="([^"]+)"> 

我想匹配腳本標記,並收集兩個ID和src屬性。我想提出不相干屬性的順序,這樣下仍然將匹配:

<script id="..." type="text/javascript" src="..."> 
<script src="..." id="..." type="text/javascript"> 
<script id="..." src="..." type="text/javascript"> 

是否可以允許的屬性出現在任何順序而不損害其收集匹配的ID和能力SRC?

編輯匹配的字符串來自innerHTML,使DOM遍歷不可能。另外,我不能爲這個特定的應用程序使用任何第三方庫。

+0

這個問題對我毫無意義。請以您認爲會使其更容易理解的任何方式重新表達它。 – 2008-12-01 18:14:59

+0

你沒有得到什麼部分? – 2008-12-01 18:17:45

回答

2

免責聲明:小心使用正則表達式和HTML源代碼。它很脆弱,因此很容易被破壞或規避,你甚至不應該想到用它來驗證用戶輸入。

如果你是真誠的源數據,並知道它符合結構良好的HTML的規則,你可以使用這個:

var html = "variable/property holding your html source"; 
var re_script = /<script\s.+?>/ig; 
var re_id  = /id="(.*?)"/i; 
var re_src = /src="(.*?)"/i; 

var scriptTag = null; 
while (scriptTag = re_script.exec(html)) 
{ 
    var matchId = re_id.exec(scriptTag); 
    var matchSrc = re_src.exec(scriptTag); 

    if (matchId && matchSrc) 
    { 
    var scriptId = matchId[1]; 
    var scriptSrc = matchSrc[1]; 
    alert('Found script ID="' + scriptId + '", SRC="' + scriptSrc + '"'); 
    } 
} 

基本上,這是jQuery的$("script").each()會做,只是沒有jQuery和不需要DOM。

0

嘗試以下操作:

<script\s*\S*\s*(id="([^"]+)")?\s*\S*\s*(src="([^"]+)")\s*\S*\s*(id="([^"]+)")?[^>]*> 

,因爲你不關心類型,因爲它使事情變得更加複雜,只是將其刪除。然後通過在src的sice上添加兩個可選的ID來強制剩下的。

或者你可以做

<script\s*(([^=]*)="([^"]*)")+\s*> 

要獲得所有屬性,然後挑出你想要的代碼的人。

+0

這個解決方案似乎是最有前途的,但我似乎無法得到JavaScript的正則表達式解析器匹配它。仍在嘗試... – giltotherescue 2008-12-01 18:41:45

1

這聽起來像一個討厭的正則表達式。國際海事組織,你可能會更好使用xpath查詢DOM。或者,你也可以使用jquery javascript庫來選擇你需要的元素。

1

您也可以嘗試使用jQuery如下:

$("script").each(function() { 
    var src = $(this).attr("src"); 
    var id = $(this).attr("id"); 

    alert(id + ": " + src); 
}); 

這會比我的腳本解析正則表達式要好得多。

1

如果您需要獲取文件的腳本標記, 可以不只是使用document.getElementsByTagName()然後只檢查(可能使用正則表達式)您需要的屬性在那裏。

正則表達式是使解析器(至少不是這樣的寬容語法如HTML)的好工具

相關問題