Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 精确正则表达式preg_替换为特殊字符_Php_Regex - Fatal编程技术网

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