Nasıl bir dize değişkeni belirli noktalarda PHP kodu enjekte edebilir?

2 Cevap php

Ben dizide CSS ve Javascript dosyaları yollarını saklayan bir sınıf var. Bu sınıf aynı zamanda (bir $ çıktı değişken olarak depolanır) benim son sayfa HTML çıktısını derler. Ben $ css ve js $ diziler döngü istiyorum ve $ çıktı belirli noktalarda HTML enjekte. CSS dosyaları hemen önce gitmek için </head> ve JS dosyaları doğru </body> önce gitmek gerekir gerekir

Benim HTML şablon dosyaları içindeki tutucu $ cssFiles ve $ jsFiles değişkenleri olması benim için bir seçenek değildir.

Ve sadece (üzgünüm), I </head> ve / veya </body> $ çıktı içinde var yoksa, kod çok başında enjekte olacağını Güvenlikli gerek daha bu zorlaştırmak için $ çıkışı.

Ben bu bir regex sorunu olduğunu varsayalım, ama ben desen (ler) ne olacağını bilmiyorum.

Teşekkürler!

2 Cevap

Basit bir str_replace() yeterli olacağını zaman ben normal bir ifade kullanmak istemem. Zaten değiştirmek için $output dizesinde açık yerler tespit ettik gibi geliyor, o yüzden böyle bir şey yapmak istiyorum:

$cssStr = '';
$jsStr = '';
foreach($css as $path) {
    $cssStr .= '<link rel="stylesheet" type="text/css" media="screen"'.
     'href="'.$path.'"/>';
}
if (strpos($output,'</head>') !== false)) {
    $output = str_replace('</head>',$cssStr.'</head>',$output);
} else {
    $output = $cssStr . $output;
}

foreach($js as $path) {
    $jsStr .= '<script type="text/javascript" src="'.$path.'"></script>';
}
if (strpos($output,'</body>') !== false)) {
    $output = str_replace('</body>',$jsStr.'</body>',$output);
} else {
    $output = $jsStr . $output;
}

Eğer kolay bir iş değildir ki, HTML "ayrıştırmak" için hazırız göz önüne alındığında, ben regex aslında, iş için doğru aracı olduğundan emin değilim.

Eğer </head> ve </body> burada hep orada, ben basit bir str_replace ile devam öneririm: basit ve regex daha hızlı.

O zaman yoksa ... Bu çok daha zor olacak sanırım ...

Burada (with strpos , for instance) ise bölümü "kafa sonu" için, kontrol edebilir; ve, değilse, ilk önce takmadan </title> etiketi (simple : use str_replace) , or the <meta> etiketleri ("sonra size bir kod eklemek için çalışalım, bu muhtemelen son olmayacak kafa bölümünde, ama hiçbir şey daha iyi bir.

</body> varsa parçası "gövde sonu" için, kontrol edebilir; bekliyoruz ANDIf, sadece tüm HTML dizesi kodunuzu usülü değil.


In any case, to "parse" HTML, I would not use regexes, but, instead, I'd go with some DOM manipulation tool, like the DOMDocument class that is bundled with PHP, and its DOMDocument::loadHTML method.