PHP preg_replace变量中的字符串

时间:2018-06-18 11:14:51

标签: php preg-replace template-engine

我使用的是PHP 7.2.4,我想制作模板引擎项目, 我尝试使用preg_replace来更改字符串中的变量, 代码在这里:

<?php
$lang = array(
    'hello' => 'Hello {$username}',
    'error_info' => 'Error Information : {$message}',
    'admin_denied' => '{$current_user} are not Administrator',
);

$username = 'Guest';
$current_user = 'Empty';
$message = 'You are not member !';

$new_string = preg_replace_callback('/\{(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/', 'test', $string);

function test($matches)
{
    return '<?php echo '.$matches[1].'; ?>';
}

echo $new_string;

但它只是告诉我

Hello , how are you?

它会自动删除变量...

更新: 这是var_dump:

D:\Wamp\www\t.php:5:string 'Hello <?php echo $username; ?>, how are you?' (length=44)

3 个答案:

答案 0 :(得分:1)

您可以使用创建关键数组(键)(您的变量)和值(它们的值),然后在$之后捕获变量部分并使用它来检查preg_replace_callback回调函数有一个名为发现捕获的键。如果是,请用相应的值替换,否则,将匹配替换为将其放回原位。

这是example code in PHP

$values = array('username'=>'AAAAAA', 'lastname'=>'Smith');
$string = 'Hello {$username}, how are you?';
$new_string = preg_replace_callback('/\{\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)}/', function($m) use ($values) {
        return 'Hello <?php echo ' . (!empty($values[$m[1]]) ? $values[$m[1]] : $m[0]) . '; ?>';
    }, $string);

var_dump($new_string);

输出:

string(47) "Hello Hello <?php echo AAAAAA; ?>, how are you?"

注意模式charnge,我在$之后移动了括号:

\{\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)}
    ^                                        ^

实际上,您甚至可以将其缩短为

\{\$([a-zA-Z_\x7f-\xff][\w\x7f-\xff]*)}
                        ^^

答案 1 :(得分:0)

你想要这样的东西吗?

Descendants

结果是:

<?php
    $string = 'Hello {$username}, how are you?';
    $username = 'AAAAAA';
    $new_string = preg_replace('/\{(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/', $username, $string);
    echo $new_string;

更简单的方法就是写

Hello AAAAAA, how are you?

答案 2 :(得分:0)

我很喜欢保持简单,所以我会使用str_replace,因为它也会改变所有可能在你前进时派上用场的实例。

$string = 'Hello {$username}, how are you?';
$username = 'AAAAAA';
echo str_replace('{$username}',$username,$string);