2015-07-10 38 views
2

在PowerShell中,我試圖在<script>塊上使用正則表達式,並嘗試使用jQuery鏈接獲取所有腳本標記的列表。所有變化如如何匹配腳本鏈接?

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

以及不同類型的引號,如單或雙。

當我匹配它時,我想匹配它們全部(全局),然後打印出所有腳本標籤(如上所示)。我到目前爲止:

if (($contents -match "src=(.*jquery.*\.js)") -eq $true) { 
    write-host "$($matches[1]) found at $($web.Url)/$url (CONTENTLINK)"; 
    write-host ""; 
} 

但它無法正常工作。我不認爲它會得到所有的匹配,並且打印的部分不僅僅是腳本標記。我怎樣才能做到這一點?

注:這是PowerShell的1

+0

你能發佈的HTML片段擁有所有你想匹配的標籤,然後讓我們瞭解您實際上希望輸出是什麼,以及目前的輸出是什麼?你也說這不是PowerShell 2.0,那它是哪個版本? – briantist

+2

我也想指出,雖然我可能試圖用正則表達式來做這件事,但我強烈建議你[使用HTML解析器來代替,正如我在這個答案中推薦的那樣](http://stackoverflow.com/a/29930250/3905079)。 – briantist

+0

我沒有確切的html代碼片段,因爲它從大約幾百頁中收集它們。 – omega

回答

0

使用的.*是去爲所有的人第一次學習正則表達式;可悲的是它有副作用,最終導致沮喪和緩慢的正則表達式操作。

我不認爲它得到所有的比賽和部分是打印變得比腳本標籤更準確地

其中一個副作用是,它消耗的一切,我的意思是一切。


這裏是我認爲劇本你要

src=\x22(?=.*jquery)([^\x22]+)\x22

說明

  • src= - 未捕獲錨文本,但它相匹配。 (找到匹配[0]但不匹配1
  • \x22 - 十六進制轉義爲"字符。更容易使用文字正則表達式模式。
  • (?=) - 展望未來。說:「我不想匹配,除非我找到的是在我的預計。它停止了比賽,如果沒有找到。
  • (?=.*jquery).*jquery某處有可能存在文字.*零次或更多次,和字面的jQuery。如果」 jQuery的」沒有找到,停止處理,否則繼續
  • ([^\x22]+) - 。我們知道我們將要匹配的東西(),所以任何字符.不是^報價[^\x22]使用它1次以上+
  • \x22 - 匹配但不消耗的最終錨文本待完成。在展望中也是上述處理.*的一個難點。

不是在PowerShell中,但在測試了(。網):

enter image description here

兩個結果(如找到的匹配)

enter image description here