Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.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_match中的反向引用_Php_Preg Replace - Fatal编程技术网

Php 用字符串变量替换preg_match中的反向引用

Php 用字符串变量替换preg_match中的反向引用,php,preg-replace,Php,Preg Replace,我正在尝试为文档创建模板,我想通过搜索文档中的[%text%]并将其替换为$array['text']或$text来用动态文本替换文档的部分。我知道我可以使用str_replace([%text%]”、$array['text']、$page),但我想找到[%(.*?%])的所有实例,并用$array[$1]替换为$1。我尝试使用create_函数($matches,$array),但它抱怨缺少{closure}()的参数2 $page = preg_replace('#\[%(.*?)%\]#

我正在尝试为文档创建模板,我想通过搜索文档中的
[%text%]
并将其替换为
$array['text']
$text
来用动态文本替换文档的部分。我知道我可以使用
str_replace([%text%]”、$array['text']、$page)
,但我想找到
[%(.*?%])
的所有实例,并用
$array[$1]
替换为
$1
。我尝试使用
create_函数($matches,$array)
,但它抱怨
缺少{closure}()的参数2

$page = preg_replace('#\[%(.*?)%\]#is', $array["$1"], $page);

首先进行preg_匹配并找到匹配的名称。然后为每个找到的名称替换数组。然后使用preg_replace with the array作为第二个参数,从而用数组中的项目替换名称。

您可以
preg_match_all(“#[%(.*?%]]#is',$page,$matches)然后

if(count($matches == 2))
{
  $key = 0;
  foreach(array_unique($matches[0]) as $val)
  {
    if(isset($array[$key]))
    {
      $page = str_replace($val, $array[$key++], $page);
    }
    else
    {
      break; // more matches than array elements
    }
  }
}

您可以使用preg_replace_回调来执行此操作

<?php
$page = preg_replace_callback('#\[%(.*?)%\]#is',
  function ($m){
    GLOBAL $array;
    return $array[$m[1]];
  }
, $page);
?>


create\u函数这两个参数都是字符串,您传递的是$array,是$array是字符串吗?这个解决方案对我来说非常有效,但我不得不稍微调整一下$page=str_replace(“[%.”$val.%]”,$array[$key],$page);我去掉了裂口;为了防止在$array[$key]未设置时结束循环,它有一个错误。
$key++
应该在
str\u replace
行中。如果您将
foreach(array_unique($matches[1])更改为$val)
foreach(array_unique($matches[0])更改为$val)
它将按照您的预期运行。我来编辑一下。