2012-07-06 25 views
0

我想寫一個正則表達式,搜索頁面的任何腳本標記並提取腳本內容,併爲了適應任何HTML寫作風格,我希望我的正則表達式包括腳本標記與任意數量的空白字符(例如,應找到<script type = blahblah><script type=blahblah>)。我的第一次嘗試最終以時髦的結果結束,所以我將問題分解成了更簡單的東西,並決定只是測試一下像\ \ s * h \ s */g這樣的正則表達式。Javascript的正則表達式空格是古怪的

當對字符串進行測試時,出於某種原因,'h'周圍的完全任意數量的空白將會匹配,而其他任意數量則不會,例如,像「h」會匹配,但「h」不會。有沒有人有一個想法,爲什麼發生這種情況或我犯的錯誤?

+6

[他來的小馬...](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – 2012-07-06 19:10:25

+1

你能給一些*特定的*例子。顯示您嘗試的* exact *代碼和您用於測試它的* exact *輸入字符串。 – 2012-07-06 19:10:49

+0

...但現在的問題是'更簡單'像/ \ s * h \ s */g。我不確定這個問題是否特別針對與HTML匹配 - 這是關於觀察/察覺的怪異。 – 2012-07-06 19:19:51

回答

2

由於您使用的是JavaScript,爲什麼不能只使用getElementsByTagName('script')?這就是你應該如何去做的。

如果您以某種方式使用HTML字符串,請創建iframe並將HTML轉儲到其中,然後在其上運行getElementsByTagName('script')

+0

它是一個HTML字符串,並將其轉儲到iframe中並加載HTML會涉及到將提取後的所有工作都放入HTML實際加載時的事件偵聽器中,這看起來更麻煩,而不值得考慮這項工作的複雜性,以及當我已經完成正則表達式方法的幾乎所有工作時。 – user1507608 2012-07-06 19:32:04

+0

@ user1507608:那麼你具體的正則表達式問題是什麼?因爲'/ \ s * h \ s */g'與'h','h'和'h'(更多的空間)相匹配。雖然如果你有全局開關'/ g',它對這些測試字符串什麼都不做。所以如果你需要幫助,你需要詳細闡述一下。否則你的問題是無法回答的。 – 2012-07-06 19:40:20

+0

您不需要任何加載處理程序,只需創建iframe並使用'document.write()'來推送HTML字符串。 – 2012-07-06 19:43:22

0

OK,延長Kolink的答案,你不需要一個iframe或事件處理程序:

var temp = document.createElement('div'); 
temp.innerHTML = otherHtml; 
var scripts = temp.getElementsByTagName('script'); 

...現在的腳本是腳本元素的DOM集合 - 和腳本不得到執行......


爲什麼正則表達式是不是這一個奇妙的想法:

作爲<script>元素不能合作在任何地方都可以使用字符串</script>,編寫正則表達式來匹配它們並不困難:/<script[.\n]+?<\/script>/gi

看起來您只想匹配具有特定類型屬性的腳本。你也可以嘗試將其納入你的模式:/<script[^>]+type\s*=\s*(["']?)blahblah\1[.\n]*?<\/script>/gi - 但那太可怕了。 (這時候,您使用不規則的字符串的正則表達式,你需要簡化會發生什麼)

因此,你遍歷所有基本匹配的腳本,提取起始標籤:result.match(/<script[^>]*>/i)[0]和內,尋找你的類型屬性/type\s*=\s*((["'])blahblah\2|\bblahblah\b)/.test(startTag)。噢,看起來 - 這很糟糕 - 簡化!

這次通過規範化: startTag = startTag.replace(/\s*=\s*/g, '=').replace(/=([^\s"'>]+)/g, '="$1"') - 現在您處於危險區域,如果=位於帶引號的字符串內怎麼辦?你能看到它變得越來越複雜嗎?

如果您對使用HTML進行可靠的假設(即使其定期使用),則只能使用正則表達式進行此項工作。否則,你的問題將會增長,併成長!

  • 免責聲明:我還沒有測試任何正則表達式用於查看他們是否按照我所說的來做,他們只是示例嘗試。
+0

完美,謝謝 – user1507608 2012-07-06 20:42:12