我尝试转换以下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工作正常)
答案 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 (因为在第一个管道之前没有)或foo
或iu
。
答案 1 :(得分:0)
不要忘记逃避管道字符:
text = Regex.Replace(text, "\\|(" + word + ")\\|iu", "<span style=\"background: #DEF9D9; font-family: Arial;\">$1</span>");
因此,正则表达式引擎会将它们解释为文字管道而不是交替运算符。