A. Php dosyası kaydetme ve kaydetme de içerir (muhtemelen)

6 Cevap php

Kurulum:

Ben iki, başlık (header.php) için bir ve altbilgi (footer.php) için bir tane içeren içeren bir standart. Php dosyası (index.php) var. Index.php dosyası gibi görünüyor:

index.php

<?php
include header.php;
?>

<h2>Hello</h2>
<p class="editable">Lorem ipsum dolar doo dah day</p>

<?php
include footer.php;
?>

Bu gibi header.php:

<html>
<head>
<title>This is my page</title>
</head>
<body>
<h1 class="editable">My Website rocks</h1>

. ve altbilgi bu gibi php:

<p>The end of my page</p>
</body>

Ben bir sayfada ". Düzenlenebilir" öğelerin herhangi bir düzenleme için olanak sağlayan bir PHP komut dosyası yazıyorum. Benim sorunum bu düzenlenebilir bölgelerin herhangi içerdiği dosyaların görünür yanı sıra ana gövde index.php olmasıdır.

Benim php kodu) file_get_contents (ile index.php dosyasını kapma; hangi iyi çalışıyor. Ben de index.php herhangi bir ". Düzenlenebilir" bölgeleri düzenlemek ve kaydetmek mümkün.

Benim sorun:

Ben içeren "bulma" bir yol bulmak ve ". Düzenlenebilir" bölgelerinde için de bu ayrıştırmak mümkün olmuştur. Ben ile ben nasıl olacağı konusunda önerileri arıyorum tüm index.php var - düzenlenebilir bölgeler için onları kontrol. Ben "* içerir. Php" bulmak için normal ifadeler kullanmak gerekir? Hatta nereden başlayacağınızı emin değilim ...

O sizin için kim benim PHP kodu görmek isteyebilirsiniz. Ben PHP sınıfının kullanımı yapıyorum: [link text] [1] benim gibi kod yazmak için izin veren:

// load the class and file
$html = new simple_html_dom();
$html->load_file("index.php");

// find the first editable area and change its content to "edited"  
$html->find('*[class*=editable]', 0)->innertext = "Edited";

// save the file
$html->save(index.php);

[1]: http://simplehtmldom.sourceforge.net/manual_api.htm simple php dom parser


UPDATE

Ben denemek ve içerir maç için düzenli ifadeler ile oynamak olmuştur. Ben regex oldukça çöp değilim ama ben yakın alıyorum düşünüyorum. İşte ben bugüne kadar ne var:

$findinclude = '/(?:include|include_once|require|require_once)\s*(?:[a-z]|"|\(|\)|\'|_|\.|\s|\/)*(?=(?:[^\<\?]|[^\?\>])*\?>)/i';

Bu garip dönmek gibi görünüyor olmasına rağmen oldukça iyi maçları) ve 'kullanılarak preg_match. Ben sadece php etiketleri arasında eşleşmesini sağlamak için regex güvenlik biraz eklemek için çalışıyorum - bu bölümü: (= (:?? [^ \ ]) * \> ) - ama sadece ilk sayfada bulunmaktadır döndürür. Bu düzenli ifade nasıl geliştirileceği konusunda herhangi bir ipucu? (Ben yaklaşık 6 saat boyunca ona olmuştur)

6 Cevap

Tamam, ben nihayet çalıştı. Herkes herhangi bir. Php dosyasında, ihtiyaç, require_oncenin include_onceyi dahil bulmak isteyen varsa o zaman preg_match_all gibi bir php fonksiyonu ile şu normal ifadeyi kullanabilirsiniz.

'/(?:include|include_once|require|require_once)\s*(?:[a-z]|"|\(|\)|\'|_|\.|\s|\/)*(?=(?:[^\<\?])*\?>)/i';

Herhangi etiketleri içinde vb içeren için bu görünüyor. Benim özgün örnek için bu geri başvurma. Benim kod şöyle görünür:

$html = new simple_html_dom();
$html->load_file("index.php");

$findinclude = '/(?:include|include_once|require|require_once)\s*(?:[a-z]|"|\(|\)|\'|_|\.|\s|\/)*(?=(?:[^\<\?])*\?>)/i';

if (preg_match_all($findinclude, $html,$includes)):

    // shift the array to the left
    $incfiles = $includes[0];
    $i = 0;

    // then loop through the includes array and print our filename
    foreach ($incfiles as $inc) {
       print basename(preg_replace('/[^a-zA-Z0-9\s\.\_\/]/', '', $inc)."\n");
    }
endif;

Işi! Ben şimdi gerektiği gibi her dosyayı düzenlemek için bu ile çalışabilirsiniz.

Eğer sistemin ne tür yaratıyor?

Bu halk tarafından kullanılan olacak eğer, ciddi güvenlik endişeleri olurdu. İnsanlar sağlanan içeriği kendi PHP kodu veya JavaScript içerebilir.

Bu dinamik içerik oluşturmak için tüm standart bir yol değildir. Çoğu amaç için, tek bir şablon oluşturmak istiyorsanız, ve sonra kullanıcıların bir veritabanına yaptıkları değişiklikleri kaydetmek için izin istiyorum. Daha sonra görüntülemek için veritabanından şablonuna bilgi doldurmak istiyorum.

Onları HTML kullanmak gibi bir şey eklemek için izin verirseniz html purifier PDO kullanılarak hazırlanmış bir deyimi ile veritabanına veri eklemek, o kadar temiz. Ben burada insanlar bir veritabanı kullanarak ilgili olabilecek herhangi bir soruya cevap için mutlu olurdu eminim.

Ben hr sonra her şeyi göz ardı, seni yanlış ettik.

Ne istediğinizi yapmak için ben basit yolu, sayfayı tarayıcıya sunmak bulur ve düzenlenebilir alanları düzenlemeleri javascript çeşit oluşturmak ve AJAX ile bir PHP dosyası olduğunu teslim etmek sanırım.

PHP dosyası sonra hala statik CMS bunu nasıl çok iyi anlamıyorum, içerik ve içeriğini değiştirmek gerekir yer alacak, ama orada bazı açık kaynak projeleri, onay here ve here. Ben onlar bunu öğrenmek için kendi kod çalışma öneririz.


İşte bunun yerine böyle bir dosyayı incluiding arasında gerçekten çok basit:

file_get_contents('/path/to/file.php');

Bunu böyle yapmak zorunda:

file_get_contents('http://your-host.com/path/to/file.php');

Ayrıca, take a look at QueryPath, SimpleHTMLDom çok daha iyi gibi görünüyor.

Verdiğiniz regex dayanarak, ben bunu biraz optimize edilmiş ve bazı önemli hatalar düzeltildi ettik:

~<[?].*?(?:include|require(?:_once)?)\s*?(?:[(]?['"])(.+?)(?:['"][)]?)\s*?;.*?(?:[?]>)?~is

Ve in preg_match_all(),

preg_match_all('~<[?].*?(?:include|require(?:_once)?)\s*?(?:[(]?[\'"])(.+?)(?:[\'"][)]?)\s*?;.*?(?:[?]>)?~is', $html, $includes);

O kadar numaralar, rakamlar, tire, altçizgi, bölü, boşluk, nokta ile dosya maç gerekir.

Also, the filename is stored in reference #1 ile biten PHP etiketi isteğe bağlıdır.

Bu token_get_all() function çok daha güvenilir, düzenli ifadeler daha olduğunu belirtmekte yarar var.

Kullanıcılar bu içine içerik göndermek ve daha sonra da bir PHP dosyası içine dahil alırsanız, o zaman ciddi bir sorun bulunmaktadır.

Sonra ve düzgün dezenfekte edildikten sonra sadece o zaman, DOM'ye içeriği eklemek gerekir - çözümlenen onları az veya hiç PHP'nin basit şablonlar, olmalıdır.

Gidermek için yol senin sorunu 'içerir bulma' - sen gerekmez, PHP sizin için yapar - belki kullanmak ob_start diğ. ve sonra şablon dosyasını içerir. Sonra (HTML olacaktır) tampon içeriğini kapmak ve sonra DOM çözümleyici ile zaten monte şablonu ayrıştırmak.

, Sen DOM'ye enjekte ne olursa olsun sterilize emin LÜTFEN lütfen.

Aksi halde, zulüm ve yıkım (sunucu üzerinde başka ne bağlı olarak, ve siz) web sitesi üzerinde aşağı yağmur kesin.

Sen sadece bir yerde kullanıcı girilen metin depolamak ve içine yükleyin, ve ile çıktı onu, PHP şablon gerekir.

Ben bir veritabanını kullanmak için öğrenme içine bakmak istiyorum. Orada hiçbir şey ağır ya da bu konuda yavaş, ve gerçekten, bu onlar için konum budur. Bir veritabanını kullanmak istemiyorsanız, bunun yerine dosyaları kullanabilirsiniz. Ben bunu biraz yapısını vermek için JSON biçiminde dosyasında veri depolama öneririm.

İşte json kodlanmış veri depolamak ve almak için dosyaları kullanmak için çok basit bir sistem.

Düzenledikten sonra kaydetmek istediğiniz bir dizi yapmak

$user_data=array('title'=>$user_supplied_info,'content'=>$user_supplied_words);
$json_data=json_encode($user_data);
file_put_contents('path_to/user_data/thisuser',$json_data);

Sonra sayfayı görüntülemek için zamanı geldiğinde

<?php
$user_data=array('title'=>'My page rocks!','content'=>'lorems ipso diddy doo dah');

$file_data=file_get_contents('path_to/user_data/thisuser');
if(!$user_data){$no_data=true;}//file not found
$data_array=json_decode($user_data,true);
if(!is_array($data_array))
  { $no_data=true; }//maybe the json could not be parsed
else
  { $user_data=array_merge($user_data,$data_array); }
?>
<html>
<head>
<title>This is my page</title>
</head>
<body>
<h1 class="editable"><?php echo $user_data['title']?></h1>

Ve böylece. Varsayılan dizisi kullanıcı herhangi bir ürünle değil ise basılır düzenlenebilir bölümler için standart içeriğini tutar. Onlar varsa, o yüklenir ve ardından varsayılan dizi ile birleşti oluyor. Varsa bir dosyadan yüklenen veriler array_merge kısmen, varsayılan dizinin bilgi üzerine yazılır.