49

データベースに次のような文字列があります(実際の文字列には数百の単語と数十の変数が含まれています):

I am a {$club} fan

この文字列を次のようにエコーします。

$club = "Barcelona";
echo $data_base[0]['body'];

私の出力はI am a {$club} fanです。欲しいI am a Barcelona fan。これどうやってするの?

4

13 に答える 13

94

を使用しstrtrます。文字列の一部を翻訳します。

$club = "Barcelona";
echo strtr($data_base[0]['body'], array('{$club}' => $club));

複数の値の場合 ( demo ):

$data_base[0]['body'] = 'I am a {$club} fan.'; // Tests

$vars = array(
  '{$club}'       => 'Barcelona',
  '{$tag}'        => 'sometext',
  '{$anothertag}' => 'someothertext'
);

echo strtr($data_base[0]['body'], $vars);

プログラム出力:

I am a Barcelona fan.
于 2013-02-25T11:00:04.057 に答える
9
/**
 * A function to fill the template with variables, returns filled template.
 *
 * @param string $template A template with variables placeholders {$variable}.
 * @param array $variables A key => value store of variable names and values.
 *
 * @return string
 */

public function replaceVariablesInTemplate($template, array $variables){

 return preg_replace_callback('#{(.*?)}#',
       function($match) use ($variables){
            $match[1] = trim($match[1], '$');
            return $variables[$match[1]];
       },
       ' ' . $template . ' ');
}
于 2013-10-16T13:10:57.440 に答える
7

sprintf()関数をお勧めします。

を格納する代わりに をI am a {$club} fan使用するI am a %s fanため、echoコマンドは次のようになります。

$club = "Barcelona";

echo sprintf($data_base[0]['body'],$club);

出力:私はバルセロナのファンです

これにより、同じコードを他の変数で自由に使用できるようになります (変数名を覚える必要さえありません)。

したがって、このコードは同じ文字列でも有効です。

$food = "French fries";

echo sprintf($data_base[0]['body'], $food);

出力:私はフライド ポテトのファンです

$language = "PHP";

echo sprintf($data_base[0]['body'], $language);

出力:私は PHP ファンです

于 2015-02-21T20:41:53.450 に答える
4

ネストされた文字列補間を探しています。ブログ投稿Wanted: PHP core function for dynamic perform double quoted string variable interpolationで理論を読むことができます。

主な問題は、使用可能なすべての変数を実際に把握しているわけではないこと、またはリストするには多すぎる可能性があることです。

次のテスト済みコード スニペットを検討してください。Mohammad Mohsenipur から正規表現を盗みました。

$testA = '123';
$testB = '456';
$testC = '789';
$t = '{$testA} adsf {$testB}adf 32{$testC} fddd{$testA}';

echo 'before: ' . $t . "\n";

preg_match_all('~\{\$(.*?)\}~si', $t, $matches);
if ( isset($matches[1])) {
    $r = compact($matches[1]);
    foreach ( $r as $var => $value ) {
        $t = str_replace('{$' . $var . '}', $value, $t);
    }
}

echo 'after: ' . $t . "\n";

コードは次のようになります。

$club = 'Barcelona';
$tmp = $data_base[0]['body'];
preg_match_all('~\{\$(.*?)\}~si', $tmp, $matches);
if ( isset($matches[1])) {
    $r = compact($matches[1]);
    foreach ( $r as $var => $value ) {
        $tmp = str_replace('{$' . $var . '}', $value, $tmp);
    }
}
echo $tmp;
于 2013-02-25T11:50:10.270 に答える
0

これが私の解決策です:

$club = "Barcelona";

$string = 'I am a {$club} fan';

preg_match_all("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", $string, $matches);

foreach ($matches[0] as $key => $var_name) {
    if (!isset($GLOBALS[$matches[1][$key]]))
        $GLOBALS[$matches[1][$key]] = 'default value';
    $string = str_replace($var_name, $GLOBALS[$matches[1][$key]], $string);
}
于 2014-07-27T22:10:23.177 に答える
-1

次のような変数名を取得するためにpreg_replace_callbackを使用できます。

$data_base[0]['body'] = preg_replace_callback(
    '#{(.*?)}#',
    function($m) {
        $m[1] = trim($m[1], '$');
        return $this->$m[1];
    },
    ' ' . $data_base[0]['body'] . ' '
);

注意: 私が書いたこのコードはclass($this);. クラスに変数を宣言できます。次に、このコードを使用して変数を検出し、次のように置き換えます。

<?php
    class a {

        function __construct($array) {
            foreach($array as $key => $val) {
                $this->$key = $val;
            }
        }

        function replace($str){
            return preg_replace_callback(
                '#{(.*?)}#', function($m) {$m[1] = trim($m[1], '$'); return $this->$m[1];},
                ' ' . $str . ' ');
        }

    }

    $obj = new a(array('club' => 3523));

    echo $obj->replace('I am a {$club} fan');

出力:

I am a 3523 fan
于 2013-02-25T11:11:18.683 に答える
-1

preg_replace PHP 関数を試してください。

<?php
    $club = "Barcelona";
    echo $string = preg_replace('#\{.*?\}#si', $club, 'I am a {$club} fan');
?>
于 2013-02-25T11:13:04.703 に答える
-1

あなたの場合、正直なところ、 eval を使用しない理由はわかりません:)
データベースにあまりにも多くの変数がある場合、変数を定義する追加の方法を次に示します。

$my_variable_name = 'club'; //coming from database
$my_value = 'Barcelona'; //coming from database
$my_msg= 'I am a {$club} fan'; //coming from database

$$my_variable_name = $my_value;  // creating variable $club dinamically
$my_msg = eval("return \"$my_msg\";"); // eating the forbidden fruit
echo $my_msg; // prints 'I am Barcelona fan'

このコードは完全にテストされ、php 7 で動作します。ただし、ユーザーがそのような文字列をデータベースに定義できるようにする場合は、それを行わない方がよいでしょう。信頼できるデータでのみ eval を実行する必要があります。

于 2020-07-29T14:12:33.097 に答える
-2

このようなものがあなたの問題を解決するはずです:

$club = "Barcelona";
$var = 'I am a {$club} fan';

$res = preg_replace('/\{\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/e', "$$1", $var);
echo "$res\n";

ワンラインpreg_replaceです。

PHP 5.5 では、/e修飾子は非推奨です。代わりにコールバックを使用できます。

$club = "Barcelona";
$var = 'I am a {$club} fan';

$res = preg_replace_callback('/\{\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/',
                             create_function(
                                 '$matches',
                                 'extract($GLOBALS, EXTR_REFS | EXTR_SKIP); return $$matches[1];'),
                              $var);
echo "$res\n";

これは、すべてのグローバル変数をインポートするハックを使用していることに注意してください。これは、まさにあなたが望むものではないかもしれません。おそらく、クロージャーを使用する方が良い考えです。

于 2013-02-25T11:09:11.400 に答える