PHP nasıl bir değişken değişken kullanabilir?

7 Cevap php

İşte yapmak çalışıyorum budur:

<?php
    $my_str = "My String";
    $str = "%my_str";

    $str = str_replace("%", "$", $str);

    echo $str;
?>

Ekrana yukarıdaki kodunu basar '$ my_str'. Ama değişken $ my_str gerçek değer gibi, 'My dize' yazdırmak istiyorum

Herkes bunu nasıl biliyor?

Benim kendi, çok temel, ayrıştırma dil yazma sürecinde, çünkü ben bu istiyorum nedeni, bu yüzden biraz ben devam etmeden önce bu fonksiyonel olması gerekir olduğunu.

7 Cevap

$my_str = 'My String';
$str    = 'my_str';

echo $$str;

Bu yapı, bir variable variable adlandırılır.

Eval gerekli değildir. Sadece% kurtulmak ve $ $ str kullanmak olsun

<?php
    $my_str = "My String";
    $str = "%my_str";

    $str = str_replace("%", "", $str);

    echo $$str;
?>

Deneyin:

echo $$str;

Siz arama ve preg_replace ile %var desenleri ve değerlendirilmektedir yedek yapar e değiştirici, yerini alabilir:

<?php
	$my_str = "My String";
	$str = "Foo %my_str bar";

	$str = preg_replace("/%([A-Za-z_]+)/e", "$\\1", $str);

	echo $str;
?>

İşte olur preg_replace %my_str, \1 içeren bulacaksınız my_str ve "$\\1" (ters eğik çizgi kaçtı gerekiyor) $ my_str değeri.

Ancak, belki bir ilişkisel dizi içinde değiştirme dizeleri depolamak için daha temiz olacaktır:

<?php
	$replacements = array(
		"my_str" => "My String",
	);
	$str = "Foo %my_str bar";

	$str = preg_replace("/%([A-Za-z_]+)/e", '$replacements["\\1"]', $str);

	echo $str;
?>

PHP otomatik olarak ayrıştırır ve içindeki değişkenler genişletir double-quoted strings:

<?php
    $my_str = "My String";
    $str = "{$my_str}";

    echo $str;
?>

Çıkışlar:

My String

Nasıl e modifiye edici ile düzenli ifade kullanımı hakkında

$str = preg_replace("/%([a-zA-Z0-9_]+)/e", '$\1', $str);

(Bu denenmemiş, ancak çalışması gerekir)

Gördüğünüz davranış şaşırtıcı değildir - değişkenler ("enterpolasyon") genişleme yerine değişkenler yerine, yalnızca dize hazır gerçekleştirilir. Eğer o olmasaydı, o zaman büyük bir güvenlik açığı (kod aniden değişkenleri açığa olacağını kullanılan bunun dolarlık bir dize herhangi bir örnek) olacaktır.

Sen can gibi, bu kullanarak eval deneyin ve düzeltmek

eval ("\$str = \"" . str_replace("%", "\$", $str) . "\"");

ama bu oldukça tehlikeli - senin dize kullanıcı ise, o zaman $ str şey gibi yapabilirsiniz

"; system("rm -rf /"); $x = "

ve aniden, belada. En iyi çözüm, inanıyorum ki, (stripos ve substring, ya da daha fazla bir şey) favori yöntemlerini kullanarak değişkenler ayrıştırmak olacak, daha sonra elle her bir yerini.