带有特殊字符的正则表达式preg_replace

时间:2018-09-21 21:41:20

标签: 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#SIM+#AT))+Found;0.25;D)+0

但是它删除了字符串中的下一个字符,我该如何更改呢?我需要一个仅删除使用特殊字符#

传递的值的正则表达式

1 个答案:

答案 0 :(得分:2)

您实际上是通过([^\w]|$)(= (\W|$))捕获组来捕获该char的。因此,要将其保留在结果中,您需要在替换模式中添加thr $2个占位符:

$formula = preg_replace('~(#AV#SIMB)([^\w]|$)~i', 'Found$2', $formula);

否则,请使用等效的非使用模式,即单词边界:

$formula = preg_replace('~#AV#SIMB\b~i', 'Found', $formula);

请参见PHP demo

$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