簡體   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