Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.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 - Fatal编程技术网

PHP preg_替换计算不起作用

PHP preg_替换计算不起作用,php,Php,我正在尝试创建一个钩子,以便在文本中找到以下内容时: level,2 它将其替换为$skill\u level*$n,逗号后的数字为$n 以下是我所拥有的: $skill_level = 2; $row['s_effect'] = "Long string of text that contains level,2." preg_replace("/level,$n/",$skill_level * $n,$row['s_effect']) 我得到的结果是: Long string of

我正在尝试创建一个钩子,以便在文本中找到以下内容时:

level,2
它将其替换为
$skill\u level*$n
,逗号后的数字为
$n

以下是我所拥有的:

$skill_level = 2;

$row['s_effect'] = "Long string of text that contains level,2."

preg_replace("/level,$n/",$skill_level * $n,$row['s_effect'])
我得到的结果是:

Long string of text that contains 02.
Long string of text that contains 4.
我想要一个结果:

Long string of text that contains 02.
Long string of text that contains 4.

出于某种原因,
“$skill\u level*$n”(2*2)
的计算似乎不起作用。

您需要使用
preg\u replace\u回调

$skill_level = 2;
$text = "Long string of text that contains level,2.";

$ret = preg_replace_callback("/level,(\d+)/", function ($matches) use ($skill_level) {
  return $matches[1] * $skill_level;
}, $text);

您需要使用
preg\u replace\u回调

$skill_level = 2;
$text = "Long string of text that contains level,2.";

$ret = preg_replace_callback("/level,(\d+)/", function ($matches) use ($skill_level) {
  return $matches[1] * $skill_level;
}, $text);

出于兴趣,使用look-behind断言而不是仅仅使用内存组有什么特别的原因吗?我想我得到的是:包含级别4的长文本字符串。应该是:包含4的长文本字符串。为了使此解决方案起作用,在调用$ret时,我使用了preg_replace(“/level,/”,“,$ret)@user1625155我没有读到您的问题,以为您只想替换数字。更新了我的答案。谢谢,我真的很感激。只是出于兴趣,你为什么要使用look-behind断言而不是仅仅使用内存组?这很接近,我想我得到了:包含级别4的长文本字符串。应该是:包含4的长文本字符串。为了使此解决方案起作用,在调用$ret时,我使用了preg_replace(“/level,/”,“,$ret)@user1625155我没有读到您的问题,以为您只想替换数字。更新了我的答案。谢谢,我真的很感激。