Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Replace中的动态变量_Php_Regex - Fatal编程技术网

Php 替换为preg_Replace中的动态变量

Php 替换为preg_Replace中的动态变量,php,regex,Php,Regex,我被这个问题难住了 我有这样一个数组: $array = [ 'name' => 'John', 'email' => john@gmail.com ]; $string = 'Hi [[name]], your email is [[email]]'; Hi john@gmail.com, your email is john@gmail.com $array = ['name' => 'John', 'email' => 'john@gmail.

我被这个问题难住了

我有这样一个数组:

$array = [
    'name' => 'John',
    'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';
echo preg_replace_callback('/\[\[(.*?)]]/', function ($m) use ($array) {
        return isset($array[$m[1]]) ? $array[$m[1]] : $m[0]; 
    }, $string);
下面是一个字符串示例:

$array = [
    'name' => 'John',
    'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';
echo preg_replace_callback('/\[\[(.*?)]]/', function ($m) use ($array) {
        return isset($array[$m[1]]) ? $array[$m[1]] : $m[0]; 
    }, $string);
问题很明显,用
John
替换姓名,用
john@gmail.com

我尝试的是:

//check if $string has [[ ]] pattern

$stringHasBrackets = preg_match_all('/\[\[(.*?)\]\]/i', $string,  $matchOutput);

if ($stringHasBrackets) {

    foreach ($matchOutput[1] as $matchOutputKey => $stringToBeReplaced) {

        if (array_key_exists($stringToBeReplaced, $array)) {

            $newString = preg_replace("/\[\[(.+?)\]\]/i",
                            $array[$stringToBeReplaced],
                            $string);

        }
    }
}
这让我找到了这样一个新字符串:

$array = [
    'name' => 'John',
    'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';
echo preg_replace_callback('/\[\[(.*?)]]/', function ($m) use ($array) {
        return isset($array[$m[1]]) ? $array[$m[1]] : $m[0]; 
    }, $string);
这很有意义,因为这是模式的目的,但不是我想要的

我怎样才能解决这个问题?我想在模式中使用一个变量,但不知道怎么做。我读过preg_replace_回调,但也不知道如何实现它


谢谢

preg\u replace
接受数组作为regex和replacement,因此您可以使用这种更简单的方法:

$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';

// create array of regex using array keys
$rearr = array_map(function($k) { return '/\[\[' . $k . ']]/'; },
         array_keys($array));

# pass 2 arrays to preg_replace
echo preg_replace($rearr, $array, $string) . '\n';
输出:

Hi John, your email is john@gmail.com
您可以这样使用:

$array = [
    'name' => 'John',
    'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';
echo preg_replace_callback('/\[\[(.*?)]]/', function ($m) use ($array) {
        return isset($array[$m[1]]) ? $array[$m[1]] : $m[0]; 
    }, $string);

详细信息

  • '/\[\[(.*)]]/'
    匹配
    […]]
    子字符串,将括号内的内容放入组1
  • $m
    保存匹配对象
  • use($array)
    允许回调访问
    $array
    变量
  • isset($array[$m[1]])
    检查
    $array
    变量中是否存在与找到的键对应的值。如果找到,则返回值,否则,将粘贴回找到的匹配项
    • 你可以试试这个

      $array = ['name' => 'John', 'email' => 'john@gmail.com'];
      $string = 'Hi [[name]], your email is [[email]]';
      $stringHasBrackets = preg_match_all('/\[\[(.*?)\]\]/i', $string,  $matchOutput);
      
      if ($stringHasBrackets) {
          $newString = $string;
          foreach ($matchOutput[1] as $matchOutputKey => $stringToBeReplaced) {
              if (array_key_exists($stringToBeReplaced, $array)) {
                  $newString = preg_replace("/\[\[$stringToBeReplaced\]\]/i", $array[$stringToBeReplaced], $newString);
              }
          }
          echo $newString;
      }
      

      我认为这里更简单的方法是使用
      str\u replace
      函数,比如:

      $array = [
                'name' => 'John',
                'email' => 'john@gmail.com'
                ];
      
      $string = 'Hi [[name]], your email is [[email]]';
      $string = str_replace(array_map(function ($v) {return "[[{$v}]]";}, 
                            array_keys($array)), $array, $string);
      echo $string;
      

      更新$array为“不可触及”

      不错的答案+1@DuongNguyen,但因为运行regex是一项非常昂贵的操作。我将包含一个if来检查字符串是否包含替换模板,检查
      [[
      ]
      参见演示。。更好的是,我没有能力做一次感谢。我们将对preg_replace_回调进行研究,如果可行,我们将与您联系@RaymondNijland我用preg_match_all检查了字符串,可以吗?“我用preg_match_all检查了字符串,可以吗?”@duongguyen
      preg_match_all
      仍然使用正则表达式现在你启动了两个正则表达式引擎。@RaymondNijland我明白了。这可能比使用正则表达式简单得多,但我不允许触摸数组,array_keys返回一个数组,那么我可以将[[和]]连接到它吗?另外,我想用数组值替换字符串中的数组_键($array)。请参阅更新版本-在这种情况下,我们还需要
      数组_映射
      。是的,它会在字符串中搜索修改过的键,并用数组值替换。谢谢你,Agnius!谢谢这很有魅力。我不是一个正则表达式向导,但你怎么知道把变量放在哪里?@DuongNguyen,谢谢:)我要做另一项关于使用数组映射的研究:D
      array\u映射
      用于将每个键转换成正则表达式。因此,
      name
      变成了
      /\[\name]/
      @bobblebble:没错,
      array\u值
      是不需要的。