2011-09-13 60 views
0

我試圖轉換下面的preg_replace:PHP這個了preg_replace在C#

$text = preg_replace("|($word)|iu", "<span style=\"background: #DEF9D9; font-family: Arial;\">$1</span>", $text); 

成C#代碼:

text = Regex.Replace(text, "|(" + word + ")|iu", "<span style=\"background: #DEF9D9; font-family: Arial;\">$1</span>"); 

但由於某些原因,更換是錯誤的。它放置html標記(<span ...></span),只有在該標記之後,纔會放入匹配的單詞(反向引用)。

這裏有什麼問題? (該PHP的preg_replace正常工作)

回答

2

PHP是在要求你寫的正則表達式作爲字符串文字加正則表達式的分隔符(|,你的情況)是唯一的。你需要做的第一件事是擺脫管道。 i(區分大小寫)和u(Unicode)修飾符也需要去。您可以通過將(?i)添加到正則表達式的開頭(順便說一句,它也適用於PHP)來使正則表達式不區分大小寫。 u是不必要的; C#字符串始終是Unicode,.NET的正則表達式始終處於Unicode模式。

代碼的C#版本是:

text = Regex.Replace(text, "(?i)(" + word + ")", "<span style=\"background: #DEF9D9; font-family: Arial;\">$1</span>"); 

你得到的結果,你所做的是將導致管道被視爲正則表達式元字符的原因 - 特別是alternation,或「OR」運營商。如果目標字正好是「富」,你的正則表達式結束了:

|(foo)|iu 

...它匹配任何什麼(因爲什麼第一管前)或fooiu

0

不要忘記逃跑的管道符:

text = Regex.Replace(text, "\\|(" + word + ")\\|iu", "<span style=\"background: #DEF9D9; font-family: Arial;\">$1</span>"); 

因此正則表達式引擎將其解釋爲文字管道,而不是運營商的交替。

+0

管道和'iu'不應該是正則表達式的一部分。他們需要被刪除,正如我在我的回答中所解釋的那樣。 –

+0

我從來不知道正則表達式在PHP中以這種奇怪的方式工作。謝謝! –