使用返回函数

时间:2016-01-27 11:01:11

标签: javascript php regex

在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内的字符串。 / p>

php中有更清洁的方法吗?

7 个答案:

答案 0 :(得分:3)

是的,在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
}

答案 1 :(得分:3)

您可以像使用preg_replace_callback一样使用IDEONE demo,使用$data关键字将preg_replace_callback数组传递给uses

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}}

请参阅{{3}}

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

答案 2 :(得分:2)

试试这段代码。它会明确地帮助你。

<?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;
?>

答案 3 :(得分:1)

您可以使用preg_replace_callback

代码示例:

$result = preg_replace_callback('/\{\{(.+?)\}\}/', 'replacementFunction', $subject);

    function replacementFunction($groups) {
       //code login here
       return "value"; 
    }

答案 4 :(得分:1)

我认为我们不需要考虑这个需求的复杂问题。如果我们试着保持简单,你可以使用sprintf函数为php格式化文本,你可以尝试下面的代码;

<?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

答案 5 :(得分:1)

<?php 
    $data = array("var1" => "World", "var2" => "You");
    echo "Hello {$data['var1']}, nice to meet {$data['var2']}";
?>

...重构

答案 6 :(得分:-1)

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

<?php
function ReplaceWord($find,$replace,$srcstring)
{
retrun str_replace($find,$replace,$srcstring);
}

echo ReplaceWord("WORLD","Peter","Hello world!");

?>