PHP这个preg_replace在c#中

本文关键字:replace 这个 preg PHP | 更新日期: 2023-09-27 18:08:24

我尝试转换以下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工作正常)

PHP这个preg_replace在c#中

PHP的独特之处在于要求您将正则表达式写成字符串字量添加正则表达式分隔符(在您的情况下为|)。你要做的第一件事就是把管子弄掉。i(不区分大小写)和u (Unicode)修饰符也需要删除。您可以通过在regex的开头添加(?i)来使regex不区分大小写(顺便说一下,这在PHP中也有效)。u是不必要的;c#字符串总是Unicode的,而。net的正则表达式总是在Unicode模式下。

该代码的c#版本应该是:

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

得到结果的原因是管道被视为regex元字符——特别是交替或"or"操作符。如果目标单词恰好是"foo",则正则表达式最终为:

|(foo)|iu

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

不要忘记转义管道字符:

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

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