2010-07-26 71 views
1

我有一個數據庫包含HTML內容的頁面ojects。很多分貝行的包含這個內容c#正則表達式替換

<p style="float: left; margin-right: 20px; height: 300px;"> 
     <img src="...">More html ... 
</p> 

所以我創建了一個超級簡單的正則表達式替換:

foreach (var page in db.Pages) 
       { 
        string pattern = @"<p style=""float: left; margin-right: 20px;"">(.*)</p>/ms"; 
        if(Regex.Match(page.Content, pattern).Success) 
        { 
         page.Content = Regex.Replace(page.Content, pattern, "<div class=\"contentimage\" >$1</div>"); 
        } 
       } 
//    db.SubmitChanges(); 

Altough,當我在一個正則表達式測試工具運行的正則表達式,它的工作原理。但在C#代碼中沒有。任何人都可以幫助我。

如果有人知道如何用sql中的正則表達式替換進行更新,那很好。

正則表達式並不是我最強烈的觀點(儘管非常遺憾)。但它是在我的清單學習儘快;)

+6

我討厭這樣說,但正則表達式是** **真的沒有選擇的工具處理。第HTML ... – 2010-07-26 20:45:52

+0

來吧馬克,你有沒有讀過Perl腳本?那些傢伙明確表示,正則表達式是所有事情的首選工具!除非你是那些認爲代碼應該可讀的lamo微軟開發人員之一,並且正則表達式應該有一套標準的非語言特定指令.. – 2010-07-26 20:58:43

+1

對於所有認爲Regex應該用於處理HTML的人,我會推薦一個好的閱讀:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454恕我直言,每當有人用'regex'和'html標記問題'標籤他應該引用這個答案。 – 2010-07-26 21:08:03

回答

3

您的問題是「/ ms」。你試圖指定一些正則表達式標誌,但是C#指定的標誌與php/perl不同(你的正則表達式測試者可能會測試針對這些語言的正則表達式,我建議使用Expresso(它是免費的)來處理.NET正則表達式。你的模式改成這樣:

string pattern = @"<p style=""float: left; margin-right: 20px; height: 300px;"">(.*)</p>"; 

(也注意到,我添加了「高度」屬性,以使其匹配 - 是隻是一個錯字?)

而且您正則表達式實例化這樣的:

if(Regex.Match(page.Content, pattern,RegexOptions.Multiline | RegexOptions.Singleline).Success) 

它應該工作。

[編輯] 哦,固定替代方法:

page.Content = Regex.Replace(page.Content, pattern, "<div class=\"contentimage\" >$1</div>", RegexOptions.Multiline | RegexOptions.Singleline); 
+0

我完全同意Marc的觀點,除非你的HTML總是和你的例子非常相似,否則Regex並不是真的要走的路。 – NickAldwin 2010-07-26 20:53:03

+0

非常感謝,像一個魅力工作。而@Marc Gravell:Regex是這份工作的正確工具。嘗試把它放在少於10行的html解析器中:D這就像一個魅力,ergo:正則表達式1 - htmlparser 0;) 我不是一個關閉正則表達式的迷,但越來越多我變成了一個 – Nealv 2010-07-26 21:12:49

+0

那麼只要HTML總是像這樣完美形成,它就可以正常工作。任何其他情況,但是,它會中斷。 – NickAldwin 2010-07-27 13:06:27