2013-08-30 81 views
-1

我有這樣的文字:正則表達式 - 更改值

<script type="text/javascript" id="wordpress_grazit_script">   
      var dbnurls = []; 
      var dbnanchors = []; 
      dbnurls.push('url'); 
      dbnanchors.push('anchor'); 
      var script = document.createElement("script"); 
      script.setAttribute("src", dbn_protocol+"path to js"); 
      script.setAttribute("type", "text/javascript"); 
      script.setAttribute("id", "grazit_script"); 
      document.getElementById("my-id").parentNode.appendChild(script); 
    </script> 

,我需要更換dbn_protocol +「路徑js的」別的東西。

我試圖使用這種匹配模式,但它匹配所有的方式到最後);

"script\\.setAttribute\\([\"']src[\"'],(.*[^\\);])(\\);)(.*)" 

我需要spcify,我需要這個表達式在C#.NET

謝謝

+0

你用什麼語言來處理腳本文本?它也是JavaScript,還是別的? – lurker

+2

調查非貪婪匹配(http://msdn.microsoft.com/en-us/library/3206d374.aspx)。目前你的'。*'會抓住所有可能的東西,你希望它抓住最小的可能數量,所以你需要'。*?'。 – Chris

+0

此外,爲什麼不只是匹配模式''dbn_protocol +「路徑到js」'並替換而不是做更復雜的事情? – Chris

回答

0

謝謝Chris爲您的答案。問題就在於你說了什麼。正則表達式正在貪婪並且一路走到最後一場比賽。我把'?'這一切都奏效了。

謝謝

0

如果在JavaScript,你可以做這樣的:

var result = yourScriptString.replace(
    /(script\.setAttribute\("src",)(.*)(\))/, 
    " $1'" + someUrl + "'$3"); 

this jsfiddle爲細節。

1

你可以只匹配從dbn_protocol(和定義的正則表達式時使用@符號,這樣你就不必做了一堆雙逃逸):

var regex = new Regex(@"dbn_protocol\+""[^""]+"""); 

ideone example

使用引號可防止正則表達式匹配超過path to js

+0

感謝'@'的建議,但我不確定dbn_protocol是否總是存在,可能是任何值,字符串或變量 –

+0

@DanielTranca哦,我認爲你的字符串有'dbn_protocol'statis(在非變量中)。 – Jerry

0

如果你只是想更換dbn_protocol +「路徑JS」的相關,有幾種方法可以做到這一點,首先你可以直接取代dbn_protocol +使用「路徑JS」的相關新的東西

string.Replace(string searchterm,string replacementterm); 

但正如你所說的你想在正則表達式的東西,所以嘗試下面的方法,它會返回一個新的字符串(這是一個新的腳本部分dbn_protocol +「路徑js」取代)。這應該滿足你,因爲它已經完成正則表達式;

Regex r = new Regex(@"dbn_protocol\+""[^""]+"""); 
string newscript=r.Replace("your script's text","the replacement string"); 
//newscript is the script text that you need. 

還有一兩件事我想,如果你需要,而你可以很容易地用手工做改變這種絕對的一次,那麼你爲什麼選擇在代碼中做點。

希望它有效。