可以用字符串替换变量吗?

时间:2011-08-28 08:36:55

标签: php

如果我有一个字符串,并且我在字符串中搜索信号后的特定文本,是否有任何方法在用同名变量替换信号后输出带有特定文本的文本字符串?

实施例

我有

$strin="This is #fruit"
$fruit="omg"

所以我搜索$ strin,使用正则表达式提取“fruit”,然后将#fruit替换为$ fruit的值。

有任何想法如何在PHP中执行此操作?

编辑 - 它可能并不总是结果。基本上有一组#things和$ variablesofthethings。所以它不会总是结果。但每个#things都有一个$ variablesofthings。所以,我不知道会是什么,但我知道有一个同名的变量。希望这是有道理的!

4 个答案:

答案 0 :(得分:4)

此处无需使用正则表达式,您可以使用str_replace

$result = str_replace("#fruit", $fruit, $strin);

答案 1 :(得分:2)

如果您的目标是找到#x令牌并将其替换为$x的值,则可以执行以下操作:

$strin = preg_replace_callback('/#([a-zA-Z_][a-zA-Z0-9_]*)/', function($match) {
    $varname = substr($match, 1);
    global $$varname;
    return $$varname;
}, $strin);

但是,如果要评估用户提供的字符串,最好在关联数组中抛出所有可能的替换。这是出于安全原因(您不希望某些Web用户能够看到您的所有全局变量,是吗?)。例如:

$tokens = array('fruit' => 'omg');

$strin = preg_replace_callback('/#([a-zA-Z_][a-zA-Z0-9_]*)/', function($match) {
    $token = substr($match, 1);
    return $tokens[$token];
}, $strin);

答案 2 :(得分:1)

您可以在PHP中使用变量来获取您的值,然后使用PHP built-int字符串插值将变量的值放在字符串中。 这样你的变量名也可以是动态的。

变量变量: 在PHP中,您可以使用这样的变量:

$fruit = 'apple';
$car = 'toyota';

但是你可以有一个变量,其名称是从另一个变量中检测出来的。像这样:

$$name;

这引用了名称为变量$ name的值的变量。因此,例如,如果从CLI参数中收到变量$ name的值:

$name = $argv[1];

然后,如果用户在命令行中输入'fruit',则变量$ name的值为'fruit',然后$$ name将引用名为$ fruit的变量,其值为'apple'。

$$name; // --> 'apple'

现在您可以使用PHP插值(在双引号括起来的字符串中)替换变量及其值:

echo "I have a $$name"; // --> I have a apple.

以下是完成此操作的完整示例:

$father = "John";
$mother = "Marta";
$brother = "Henry";
$relative = $$argv[1]; // or you could read the relative from any source
echo "I love $relative";

答案 3 :(得分:0)

替换单个变量

如果要替换单个变量,可以使用这个简单的正则表达式:

$text = preg_replace('/#fruit\b/', $fruit, $string);

\b之后的#fruit可确保我们不会意外地替换#fruit2

替换多个变量

如果要替换多个变量,可以使用preg_replace_callback一次性替换它们:

$vars = array(
    'fruit' => 'apple',
    'color' => 'red',
);
$text = preg_replace_callback('/#(\w+)\b/', function($match) use ($vars) {
    if (isset($vars[$match[1]])) {
        return $vars[$match[1]];
    } else {
        return $match[0];
    }
}, $string);

正则表达式将匹配任何#,后跟字母和数字以及_(\w匹配[a-zA-Z0-9_])。对于每个匹配,如果$ vars中存在具有该名称的变量,则它将被变量值替换。

如果要使用真正的PHP变量替换变量(例如,将#fruit替换为$fruit),请将$vars设置为$GLOBALS

$vars = $GLOBALS;

那样做。如果字符串来自用户,他们将能够获得任何变量的值。

用PHP替换多个变量< 5.3

之前的解决方案使用了一个闭包,因此您需要PHP 5.3来执行它。

如果你没有PHP5.3,你也可以这样做:

class Replacer {
    private $vars = array(
        'fruit' => 'apple',
        'color' => 'red',
    );
    function replace($match) {
        if (isset($this->vars[$match[1]])) {
            return $this->vars[$match[1]];
        } else {
            return $match[0];
        }
    }
}

$text = preg_replace_callback('/#(\w+)\b/', array(new Replacer, 'replace'), $string);

为什么要为此使用课程?这样函数就可以访问$this->vars,这可以避免使用全局变量。

变量插值

如果您尝试在字符串文字中插入变量,PHP可以为您执行此操作:

$fruit = 'apple';
$string = "The fruit is: $fruit";

当您使用双引号括起字符串时,PHP会识别变量并自动替换它们。