2012-04-24 51 views
0

很難把一切都在問題的標題,因爲它是具體取決於人想分裂什麼的字符串。但在這裏,它是:邏輯的正則表達式在JavaScript字符串分割到多個字符串

我在其中有多個腳本標記的字符串:

<script type="text/javascript" src="/javascripts/something-1.js"></script> 
<script type="text/javascript" src="/javascripts/something-2.js"/> 
<script type="text/javascript" src="/javascripts/something-3.js"></script> 
<link rel="stylesheet" type="text/css" href="/something-1.css"> 

我想這個字符串分割成多個字符串,每個包含腳本標籤(忽略鏈接標籤)。這是我做的:

var scripts = code.match(/<script.*src=.*(\/>|<\/script>)/g); 

這是與結束標記要麼/></script>匹配script標籤。然而,有了這個當前的正則表達式,我總是得到:

<script type="text/javascript" src="/javascripts/something-1.js"></script> 
<script type="text/javascript" src="/javascripts/something-2.js"/> 

作爲一個字符串 - 不是兩個。

怎樣的正則表達式是這樣的:

/<script.*src=((not script not link) /> | (not link) <\/script>)/g 

回答

2

變化.*.*?以儘可能少的,而不是儘可能地匹配。

2

另一種方式來處理,這是通過使用XMLDOM使用「SRC」的「腳本」標籤的屬性中,走在頁面的部分或全部XML文檔。這是一個積極的方式來抓住他們,避免鏈接。

1

我會使用類似

var rx = /<script.+?src=.+?\/(script)?>/gim; 

這將匹配任何東西:

  • 開始<script
  • 具有至少1個以上的字符(可以是一個空間,例如,或者一些其他屬性值對)
  • src=
  • 具有至少1個字元
  • 然後要麼/>/script>

和標誌...

  • 標誌爲不區分大小寫
  • 標誌是用於多匹配
  • the m標誌爲用於多源(假設這些線實際上是線本身和在總不是單行線)

編輯:我沒有考慮到具有在一個get值像&src=etc的可能性地址的值爲src屬性。

+0

「m」標誌不相關。只有當你使用錨點('^'和'$')來匹配行的開始和結束時才重要。 – 2012-04-25 01:57:42

+0

請原諒我的無知(這是一個嚴重的問題),但是如果結束標記位於以下行中,例如?將省略** m **旗子仍然讓它被抓住? – inhan 2012-04-25 02:02:24

+0

在這種情況下,你的regex會失敗,因爲'.'與換行符不匹配,多行模式不會改變它。它所做的只是改變'^'和'$'的行爲,允許它們在行邊界以及整個字符串的開始和結尾進行匹配。經常重複的建議「如果源字符串是多行,你必須使用多行模式」是錯誤的。您可能會考慮*單行*或* DOTALL *模式,它使'.'匹配任何字符,但JavaScript不支持。 – 2012-04-25 03:05:52

2

一般來說,你試圖做的事是不可能的。但是,如果您可以對源字符串進行某些簡化的假設,則可以創建足夠好的正則表達式。這是我想嘗試:

/<script(?:\s+\w+\s*=\s*"[^"]*")+\s*/?>(?:</script>)?/gi 

解釋:

  • <script開始標籤的開頭匹配。

  • (?:\s+\w+\s*=\s*"[^"]*")+佔用一個或多個屬性

  • \s*/?>開始標籤的結束相匹配。如果是自閉標籤,則/?消耗斜槓。

  • \s*(?:</script>)?否則,這匹配結束標記。

的基本思想是用的東西,不能在開始標記結束匹配>,因此「越獄」,以配合比你想要更多的替換.*。當然,沒有保證。我甚至不知道你的HTML是否有效,並且有很多方法可以在有效的HTML中愚弄這個正則表達式。

相關問題