繁体   English   中英

可以替换字符串中的变量吗?

[英]Replacing variable in string possible?

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

我有

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

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

任何想法如何在PHP中做到这一点?

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

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

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

如果您的目标是找到#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);

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

变量变量:在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";

替换单个变量

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

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

#fruit之后的\\b确保我们不会意外替换例如#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会识别变量并自动替换它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM