preg_replace ile arama dizesi

2 Cevap php
$html = file_get_contents("1.html");
eval("print \"" . addcslashes(preg_replace("/(---(.+?)---)/", "\\2", $html), '"') . "\";");

Bu bir dize arar ve $ değişken --- --- $ değişkeni değiştirir.

Bunun için --- $ _SESSION ['değişken'] --- arar ve $ _SESSION ['değişken'] ile değiştirir böylece nasıl Senaryoyu yazabiliriz?

2 Cevap

Sadece yedek değişebilir:

preg_replace("/(---\\\$_SESSION\\['(.+?)'\\]---)/", "\${\$_SESSION['\\2']}", $html)

ama ben bunu hiç tavsiye etmem. Her zaman olduğu gibi, eval Eğer yanlış bir şey yaptığınızı büyük bir ipucudur.

$ 1.html veya oturum değişkeni olmayan çiftleşmiş kullanımları hatalara neden olur. 1.html veya oturum değişkeni rasgele kod potansiyel sunucu ödün, ${...} söz dizimi ile idam edilebilir. Cross-site scripting saldırıları yol, olduğu gibi-az-daha oturum değişkeni işaretleri veya 'işareti çıkış olacaktır.

Daha iyi bir strateji, sadece bir dize değil, bir PHP komut olarak dize tutmaktır. ---...--- bölümleri bulmak ve ayrı olanlar yerine:

$parts= preg_split('/---(.+?)---/', $html, null, PREG_SPLIT_DELIM_CAPTURE);
for ($i= 1; $i<count($parts); $i+= 2) {
    $part= trim($parts[$i]);
    if (strpos($part, "\$_SESSION['")==0) {
        $key= stripcslashes(substr($part, 11, -2));
        $parts[$i]= htmlspecialchars($_SESSION[$key], ENT_QUOTES);
    }
}
$html= implode('', $parts);

(, Bu genellikle böyle değil test edilmiş, ancak doğru çizgiler boyunca olmalıdır Eğer gerçekten aktif HTML içerdiği için değişken istiyorsanız istiyoruz, htmlspecialchars olmayabilir değil..)

İhtiyacınız fonksiyonu preg_quote() . But before I post any code here: Are you really really really emin $html or sizin $_SESSION['variable'] {[gibi hiçbir kötü niyetli dizeler içeren bir (5)]}? Eğer çift çek. Eğer still ise, bu kullanarak devam edin:

preg_replace("/(---" . preg_quote($_SESSION['variable'], '/') . "---)/", "\\2", $html)