PHP中的这个preg_replace在C#中

时间:2011-09-13 17:47:10

标签: c# php regex

我尝试转换以下preg_replace:

$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 个答案:

答案 0 :(得分: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”,那么你的正则表达式最终成为:

|(foo)|iu

...匹配 nothing (因为在第一个管道之前没有)或fooiu

答案 1 :(得分:0)

不要忘记逃避管道字符:

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

因此,正则表达式引擎会将它们解释为文字管道而不是交替运算符。