用返回函数替换 PHP 中的字符串


String replace in PHP with return function

在javascript中,你可以在执行字符串替换时定义一个返回函数:

function miniTemplate(text, data) { 
    return text.replace(/'{'{(.+?)'}'}/g, function(a, b) {
        return typeof data[b] !== 'undefined' ? data[b] : '';
    });
}

这几行代码使我能够创建一个非常整洁的模板系统。正则表达式匹配文本变量内的所有"{{something}}"字符串,如果对象数据中有内容,则返回函数匹配,如果是,则替换它。

所以

text = "Hello {{var1}}, nice to meet {{var2}}";
data = { var1: "World", var2: "You" }
//result => "Hello World, nice to meet You"

我试图复制此功能的是 PHP,但我想到的唯一解决方案是使用 2 个 cicles,一个解析数据数组的每个元素,第二个在第一个元素中查找 Text 中的字符串。

php 中有更干净的方法吗?

你可以像

这样使用preg_replace_callback,就像在JavaScript中一样(使用uses关键字将$data数组传递给preg_replace_callback):

function miniTemplate($text, $data) { 
     return preg_replace_callback('~'{'{(.*?)}}~', function ($m) use ($data) {
         return isset($data[$m[1]]) ? $data[$m[1]] : $m[0]; 
     }, $text);
}
$text = "Hello {{var1}}, nice to meet {{var2}}";
$data = array("var1" => "World", "var2"=> "You");
echo miniTemplate($text, $data); // => Hello World, nice to meet You at {{var3}}

查看 IDEONE 演示

如果 $data 中缺少一个值,则当我们首先检查它是否存在于isset($data[$m[1]])时,将返回模板字符串。

是的,在 PHP 中,有一个函数preg_replace_callback()你可以将函数传递给它来处理替换:

$result = preg_replace_callback('/'{'{(.+?)'}'}/', 'do_replacement', $subject);
function do_replacement($groups) {
    // $groups[0] holds the entire regex match
    // $groups[1] holds the match for capturing group 1
    return ''; // actual program logic here
}

试试这段代码。 它肯定会帮助你。

<?php
$text = "Hello {{var1}}, nice to meet {{var2}}";
$data = array("var1"=>"World","var2"=>"You");
foreach($data as $key => $value){
   $text = str_replace('{{'.$key.'}}', $value, $text);
}
echo $text;
?>
您可以使用

preg_replace_callback。

代码示例 :

$result = preg_replace_callback('/'{'{(.+?)'}'}/', 'replacementFunction', $subject);
    function replacementFunction($groups) {
       //code login here
       return "value"; 
    }
<?php 
    $data = array("var1" => "World", "var2" => "You");
    echo "Hello {$data['var1']}, nice to meet {$data['var2']}";
?>

重构...

我认为

我们不需要考虑这种需求的复杂性。如果我们尽量保持简单,您可以使用 php 的 sprintf 函数来格式化文本,您可以尝试下面的代码吗?

<?PHP
    $format = "Hello %s, nice to meet %s";
    $jsonData = "{'"var1'": '"World'", '"var2'": '"You'" }";
    $data = json_decode($jsonData);
    $result = sprintf($format,$data->var1,$data->var2);
    echo $result;
?>

工作示例在这里 https://ideone.com/AGNZen

一个快速的解决方案可能是这个,

<?php
function ReplaceWord($find,$replace,$srcstring)
{
retrun str_replace($find,$replace,$srcstring);
}
echo ReplaceWord("WORLD","Peter","Hello world!");
?>