2012-07-09 74 views
0

我想要做的是打開文件並搜索「searchText」。我想用一個新的鏈接替換文件中的所有實例,實際上它只是帶有achor鏈接的文件名,所以不是打開javascript,而是轉到頁面中的另一個點。嘗試替換HTML文檔中的字符串並添加額外字符

到目前爲止,我有什麼是這樣的:

private void writeNotes(){ 
     StreamReader reader = new StreamReader(openFileDialog1.FileName); 
     string content = reader.ReadToEnd(); 

     reader.Close(); 

     string fileName = openFileDialog1.SafeFileName; 
     string searchText = "<a class=\"x-fn\" href=\"javascript:void(0);\">"; 
     string replaceText = "<a class=\"x-fn\" href=\"" + fileName + "#fn" + "\">"; 

     content = Regex.Replace(content, searchText, replaceText); 

     StreamWriter writer = new StreamWriter(openFileDialog1.FileName); 
     writer.Write(content); 
     writer.Close(); 

然而,編寫和關閉後...我打開了該文件,並沒有作出任何的改變。除此之外,我想要做的是在每個替換實例的「#fn」之後添加一個數字。所以,基本上,我每次替換爲其他的JavaScript鏈接,我希望它是:

<a class="x-fn" href="fileName#fn1"> 

,然後當我更換的JavaScript的第二個實例,它讀取

<a class="x-fn" href="fileName#fn2"> 

等在...

我想我將不得不計算JavaScript出現的次數的實例,替換它,並使用for循環遍歷所有新鏈接並添加#fn(n)at結束?

+3

你知道你可以使用HtmlAgilityPack的HTML編輯爲好,對不對? – 2012-07-09 18:20:43

+1

你爲什麼使用正則表達式?一個簡單的字符串替換會做..特別是因爲你的搜索字符串不是正則表達式! – banging 2012-07-09 18:28:01

+0

使用調試器。也許你的正則表達式找不到匹配。我還建議使用字符串替換作爲敲打說。不必擔心這種特殊的正則表達符號。 – 2012-07-09 18:31:20

回答

2

你的問題是你有元字符(在這種情況下,「無效(0)」)打開和關閉paren。而不是代表文字開放和關閉的parens,這是創建一個正則表達式組,導致您的匹配失敗。如果你用反斜槓離開了這個對象,它會按預期工作。

但是,由於您只是匹配字符串文字,所以您根本不需要使用正則表達式;使用string.Replace會更快。

至於你的問題的第二部分,這有點棘手。沒有簡單的方法可以做到這一點,所以最好的方法是在輸入中查找您的搜索文本,然後在建立一個StringBuilder時,增加一個計數變量。在下面的例子中,爲了簡單起見,「the」這個詞被替換爲「(0)」和「(1)」,但是你可以很容易地適應你的問題。

var content = "the quick brown fox jumped over the lazy dog"; 
var searchText = "the"; 
var sb = new StringBuilder(); 
var idx = -1; // will hold the index of our search text 
var uncopiedIdx = 0; // the start index of what hasn't been copied yet 
var replacementCount = 0; 
while((idx = content.IndexOf(searchText, idx+1)) != -1) { 
    // copy everything leading up to our search text 
    sb.Append(content.Substring(uncopiedIdx, idx-uncopiedIdx)); 
    // copy the replacement text, with the replacement count 
    var replacement = "(" + replacementCount++ + ")"; 
    sb.Append(replacement); 
    // skip over the search text 
    uncopiedIdx = idx + searchText.Length; 
} 
// copy everything after the last match 
sb.Append(content.Substring(uncopiedIdx)); 
+0

您也可以使用'Regex.Escape'來確保將字符串視爲正則表達式中的所有文字。 – Servy 2012-07-09 18:46:09

+0

好的,我被移除了正則表達式,而只是使用了string.Replace。但是,在我運行它之後,更改仍然沒有完成。我是否偶然保存它?謝謝你的幫助! – JMarsh 2012-07-09 18:51:52

+0

你正在用'SafeFileName'打開這個文件,它不包含路徑,但是你用'FileName'保存它,它包含路徑。所以你可能會保存在一個不同的位置,你打開它的文件.... – 2012-07-09 19:11:03

1

您可以使用MatchEvaluator,它應該一次完成。
事情是這樣的 -

C#

string content = 
@" 
    <a class=""x-fn"" href=""javascript:void(0);""> 
    <a class='x-fn' href = ""javascript:void(0); ""> 
    <a href='javascript:void(0);' class=x-fn > 
    <a class=""x-fn"" href=javascript:void(0); > 
    <a 'hello' href=javascript:void(0); world class=x-fn > 
    "; 
string fileName = "FILE"; 

Regex jsRx = new Regex(
    @" 
    <a 
     (?=\s) 
     (?= 
      (?: [^>""']|""[^""]*""|'[^']*')*? (?<=\s) 
      class \s*= 
      (?: 
       (?> \s* (['""]) \s* x-fn \s* \1)   # (1) quote 
       | (?> (?!\s*['""]) \s* x-fn (?=\s|>) ) 
      ) 
     ) 
     (?= 
      ((?: [^>""']|""[^""]*""|'[^']*')*?) (?<=\s)  # (2) - before 'href' 
      href \s*= 
      (?: 
       (?> \s* (['""]) \s* javascript:void\(0\); \s* \3 ) # (3) quote 
       | (?> (?!\s*['""]) \s* javascript:void\(0\); (?=\s|>)) 
      ) 
      ((?> (?:"".*?""|'.*?'|[^>]?)+))     # (4) - after 'href' 
     ) 
     (?> \s+ (?:"".*?""|'.*?'|[^>]*?)+ 
    >   
     ) (?<! />) 
    ", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); 

int counter = 0; 
string contentNew = jsRx.Replace(content, delegate(Match match) 
{ 
    return "<a" + match.Groups[2] + "href=\"" + fileName + "#fn" + (counter++) + "\"" + match.Groups[4] + ">"; 
}); 

Console.WriteLine(contentNew); 

輸出

<a class="x-fn" href="FILE#fn0"> 
<a class='x-fn' href="FILE#fn1"> 
<a href="FILE#fn2" class=x-fn > 
<a class="x-fn" href="FILE#fn3" > 
<a 'hello' href="FILE#fn4" world class=x-fn > 
+0

感謝您的想法! – JMarsh 2012-07-10 18:10:21

+0

歡迎您!它的解決方案需要一年的時間才能完善。不再是一個想法。 – sln 2012-07-10 20:16:28