Php 精确正则表达式preg_替换为特殊字符
我需要传递一个带有散列的字符串,并用另一个值更改该值。我正在尝试以下代码:Php 精确正则表达式preg_替换为特殊字符,php,regex,Php,Regex,我需要传递一个带有散列的字符串,并用另一个值更改该值。我正在尝试以下代码: $formula = "ARRED(((CAT(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SIM+#AT))+#AV#SIMB);0.25;D)+0"; $formula = preg_replace('~(#AV#SIMB)([^\w]|$)~i', "Found", $formula); RESULT = ARREDD(((QTDCAT2(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SI
$formula = "ARRED(((CAT(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SIM+#AT))+#AV#SIMB);0.25;D)+0";
$formula = preg_replace('~(#AV#SIMB)([^\w]|$)~i', "Found", $formula);
RESULT = ARREDD(((QTDCAT2(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SIM+#AT))+Found;0.25;D)+0
但它会删除字符串中的下一个字符,我如何更改它?我需要一个正则表达式,它只删除与特殊字符
一起传递的值。实际上,您可以使用([^\w]|$)
(=(\w |$)
)捕获组捕获该字符。因此,要将其保留在结果中,您需要将thr$2
占位符添加到替换模式中:
$formula = preg_replace('~(#AV#SIMB)([^\w]|$)~i', 'Found$2', $formula);
否则,请使用等效的非消费模式,即单词边界:
$formula = preg_replace('~#AV#SIMB\b~i', 'Found', $formula);
见:
@正如您在我的示例中看到的,除非您使用的模式不同,否则它们都应该工作。如果
SIMB
以非单词字符结尾,则是,\b
将不起作用。如果SIMB
以单词字符结尾,\b
将与单词字符之后的位置相同,\b
匹配非单词字符或字符串结尾之前的位置。
$formula = "ARRED(((CAT(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SIM+#AT))+#AV#SIMB);0.25;D)+0";
echo preg_replace('~(#AV#SIMB)([^\w]|$)~i', 'Found$2', $formula) . "\n";
echo preg_replace('~(#AV#SIMB)\b~i', 'Found', $formula);
// => ARRED(((CAT(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SIM+#AT))+Found);0.25;D)+0
// => ARRED(((CAT(#AVSIM#+#AV#AT8+#AV#ATD+#AV#SIM+#AT))+Found);0.25;D)+0