2012-10-25 103 views
2

我想從我通過CFHTTP請求接收的HTML內容中提取JavaScript代碼。<script></script></script>標籤與RegEx for Coldfusion包括換行符

我有這個簡單的正則表達式,只要在代碼之間的代碼中沒有換行符就可以捕獲每一個正則表達式。

var result=REMatch("<script[^>]*>(.*?)</script>",html); 

這將趕上:

<script>testtesttest</script< 

但不

<script> 
testtest 

</script> 

我曾嘗試使用(M?)爲多,但它不喜歡的工作。 我使用reference來弄清楚,但我只是沒有得到它與正則表達式。

擡起頭,通常不會有腳本標籤之間的JavaScript,而不是簡單的文本,還字符,如{}();:-_等

任何人都可以幫我嗎?

乾杯

[更新]] 謝謝你們,我會盡量解決方案。我喜歡正則表達式,因爲我也會查看HTML解析器。

+0

可能會更好地使用適當的HTML解析器比正則表達式:http://www.bennadel.com/blog/2341-ColdFusion-10-Parsing-Dirty-HTML-Into-Valid-XML-Documents。 htm | HTTP://www.bennadel。COM /博客/ 2358-解析穿越 - 和 - 不同誘變-HTML-WITH-的ColdFusion和 - jSoup.htm。這是值得一讀的喜劇價值:http://stackoverflow.com/a/1732454/419 :) – Kev

回答

8

(?m)多模式是製作上的換行符^$比賽(不僅僅是開始/結束字符串作爲默認值),但你想在這裏做的是讓.包括換行符 - 爲您要(?s) (點全部模式)。

但是,我可能不會這樣做與正則表達式 - HTML解析器是一個更強大的解決方案。以下是如何與jSoup做到這一點:

var result = jsoup.parse(html).select('script').text(); 

更多細節上的CF是available here使用jSoup,或者您可以使用TagSoup分析器,它ships with CF10(所以你不必擔心瓶/等) 。


如果你真的想要的正則表達式,那麼你可以使用這個:

var result = rematch('<script[^>]*>(?:[^<]+|<(?!/script>))+',html); 

與使用(?s).*?這避免匹配空塊(但它仍然會失敗在某些極端情況 - 如果精度要求使用HTML解析器)。

要提取剛剛從第一個腳本塊的文本,你可以用這個剝離的腳本標籤:

result = ListRest(result[1] , '>'); 
0

可以使用點匹配所有的模式或更換.[\s\S]得到同樣的效果。

<script[^>]*>[\s\S]*?</script> would match everything including newlines. 
+0

使用'[\ s \ S]''的唯一原因是當'(?s)'isn' t可用(但它在這裏)。 –

+0

@PeterBoughton,你的答案提到的修飾語,所以我提到了另一種選擇 – pogo