2010-01-09 3 views
2

Установка:Сохранение .php файла и сохранение включает в себя также (возможно)

У меня есть стандартный .php файл (index.php), который содержит два включает в себя, один для заголовка (header.php) и один для нижнего колонтитула (footer.php). Файл index.php выглядит следующим образом:

index.php

<?php 
include header.php; 
?> 

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

<?php 
include footer.php; 
?> 

header.php так:

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

и сноска .php как это:

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

Я пишу PHP-скрипт, который позволяет вам редактировать любой элемент «.editable» на странице. Моя проблема в том, что эти редактируемые области могут появляться в любых включенных файлах, а также в основной части index.php.

Мой php-код захватывает файл index.php файлом_get_contents(); который работает хорошо. Я также могу редактировать и сохранять любые «разрешенные» регионы в index.php.

Мой вопрос:

Я не смог найти способ «найти» ВКЛЮЧАЕТ и анализировать через тех, для «.editable» регионов. Я ищу предложения о том, как я буду работать через все входящие в index.php - проверять их на редактируемые регионы. Нужно ли использовать регулярные выражения для поиска «include * .php»? Я не уверен, где начать ...

Для тех из вас, кто может пожелать увидеть мой PHP-код. Я делаю использование класса PHP: [текст ссылки] [1], который позволяет мне писать код, как:

// 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простого PHP дом синтаксического анализ


UPDATE

Я играл с регулярными выражениями, чтобы попытаться совместить включенные. Я довольно мусор в регулярном выражении, но я думаю, что приближаюсь. Вот то, что я до сих пор:

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

Это соответствует довольно хорошо, хотя это, кажется, вернуть нечетные) и "при использовании preg_match. Я пытаюсь добавить немного безопасности в регулярное выражение, чтобы убедиться, что оно совпадает только между php-тегами - эта часть: (? = (?: [^ \ < \?] | [^ \?>]) * \?>) - но он возвращает только первое включение на странице. Любые советы о том, как улучшить это регулярное выражение? (Я был у него около 6 часов)

+0

Это серьезное отверстие для безопасности. Позволить людям редактировать фактический PHP-код, который будет работать на вашем сервере, не является разумным. –

+0

@George Edison - код PHP не редактируется. Только HTML вокруг PHP. По моему мнению (при условии, что все сохраненные данные проверены правильно) это ничем не отличается от системы, которая редактирует файлы HMTL. – Scott

ответ

0

Хорошо, я, наконец, сработал. Если кто-то хочет найти какие-либо include, include_once, require, require_once в .php-файле, тогда вы можете использовать следующее регулярное выражение с помощью php-функции, такой как preg_match_all.

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

Этот поиск любых включений и т. Д. В тегах. Обратившись к нему обратно к моему оригинальному примеру. Мой код выглядит так:

$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; 

Работа выполнена! Теперь я могу работать с этим, чтобы редактировать каждый файл по мере необходимости.

1

Какой тип системы вы создаете?

Если это будет использоваться общественностью, у вас возникнут серьезные проблемы с безопасностью. Люди могут включать свой собственный PHP-код или JavaScript в поставляемом контенте.

Это не стандартный способ создания динамического контента. Для большинства целей вам нужно создать один шаблон, а затем разрешить пользователям сохранять свои изменения в базе данных. Затем вы должны заполнить информацию в шаблоне из базы данных для отображения.

Если вы разрешите им включать HTML, используйте что-то вроде html purifier, чтобы очистить его, вставьте данные в свою базу данных с помощью подготовленного заявления, используя PDO. Я уверен, что люди здесь будут рады ответить на любые вопросы, которые могут возникнуть по поводу использования базы данных.

+0

Я надеюсь, что это будет легкая система управления контентом. Все системные пользователи/редакторы должны будут войти в систему, чтобы вносить изменения, и все сохраненные HTML будут проверяться с помощью чего-то по строкам htmlpurifier.org (спасибо за ссылку). В этом случае я не хочу использовать базу данных для контента. – Scott

+0

Я вижу. Конечно, если всем людям, которым доверяют, доверяют, тогда их изменение в потенциально исполняемых файлах может быть в порядке. Тем не менее, я бы предложил взглянуть на структурную философию шаблонов и использование БД. Я бы сохранил редактируемый контент отдельно от части презентации, будь то в БД или в виде файла. Затем загрузите его в скрипт и покажите его, если он доступен, или покажите содержимое по умолчанию, если нет изменений. Это избавит вас от необходимости делать то, что задал ваш первоначальный вопрос. – JAL

0

Если пользователи могут отправлять материалы в них, а затем они включаются в файл PHP, то у вас есть серьезные проблемы.

У вас должны быть простые шаблоны, в которых у них мало или вообще нет PHP, которые анализируются - тогда и только тогда вы должны вставлять содержимое в DOM после правильной очистки.

Способ решения проблемы с поиском входящих вопросов - вам не нужно, PHP делает это за вас - возможно, используется ob_start и др. а затем включить файл шаблона. Затем возьмите содержимое буфера (которое будет HTML), а затем проанализируйте уже собранный шаблон с помощью анализатора DOM.

Пожалуйста, пожалуйста, ПОЖАЛУЙСТА, убедитесь, что вы санируете все, что вы вводите в DOM.

В противном случае, тирания и разрушение наверняка будут опускаться на ваш веб-сайт (и вы, в зависимости от того, что еще находится на вашем сервере).

+0

Благодарим за отзыв. Все пользователи должны будут войти в систему, чтобы редактировать разделы, и все данные будут также сильно проверены. Поскольку файлы шаблонов могут содержать php, я не вижу другого способа сделать это - так как мне нужно сохранить этот PHP и только манипулировать html в/вокруг него. Я играл с буфером вывода и продолжаю ... пока это не дало мне ясного способа сделать эту работу. – Scott

+1

Вы думаете о хранении редактируемых частей в базе данных? или, по крайней мере, csv или что-то еще? Итак, по крайней мере, тогда вам не нужно разбирать DOM и попробовать и анализировать php, вам просто нужно сделать, как ' ' –

1

Я вас неправильно понял, не обращайте внимания на все после hr.

Чтобы сделать то, что вы хотите, я думаю, самый простой способ - представить страницу в браузере, создать какой-то javascript, который находит и редактирует редактируемые области и передает это в файл PHP через AJAX.

Файл PHP затем получит контент и место, где он должен изменить содержимое, но я до сих пор не очень хорошо понимаю, как это делает статическая CMS, но есть некоторые проекты с открытым исходным кодом, проверьте here и here. Я предлагаю вам изучить их код, чтобы узнать, как они это делают.


Это действительно просто, а incluiding файл так:

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

Вы должны сделать это так:

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

Кроме того, take a look at QueryPath, кажется, много лучше, чем SimpleHTMLDom.

+0

Спасибо, я посмотрел на другие CMS, на которых вы указали мне, и они работают по-другому. Однако все хорошие исследования. QueryPath выглядит прилично. – Scott

+0

@Scott: Вы уверены? Вы видели ** Orbis CMS ** и ** MechEdit **? –

+0

@Alix Axel - MechEdit работает только с HTML-файлами - поэтому он не должен уважать PHP-код, например, включает в себя и т. Д. Orbis хранит свои данные отдельно от файлов шаблонов, а затем использует PHP-код для размещения соответствующего контента в нужном месте : например "" - оба имеют похожие модели, но все они немного отличаются друг от друга. – Scott

0

Вам нужно просто сохранить введенный пользователем текст и загрузить его и вывести его с помощью шаблона PHP.

Я бы изучил возможность использования базы данных. В этом нет ничего тяжелого или медленного, и на самом деле это то, за что они нужны. Если вы не хотите использовать базу данных, вы можете использовать файлы вместо этого. Я бы предложил сохранить данные в файле в формате JSON, чтобы создать некоторую структуру.

Вот очень простая система для использования файлов для хранения и получения JSON-кодированных данных.

Сделать массив, что вы хотите сохранить после редактирования

$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); 

Тогда, когда пришло время, чтобы отобразить страницу

<?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> 

И так далее. Массив по умолчанию содержит стандартный контент для редактируемых разделов, которые печатаются, если пользователь не предоставил никаких. Если они есть, они загружаются и затем объединяются с массивом по умолчанию. Данные, загруженные из файла, будут перезаписывать информацию массива по умолчанию, если она доступна, в части array_merge.

1

на основе регулярных выражений, вы предоставили, я оптимизировано его немного и исправлены некоторые важные ошибки:

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

И в preg_match_all():

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

Он должен соответствовать имена файлов с номерами, цифрами , тире, символы подчеркивания, косые черты, пробелы, точки и т. д.

Кроме того, имя файла хранится в ссылке # 1, а конечный PHP-тег является необязательным.

Следует упомянуть, что token_get_all() function гораздо надежнее, чем регулярные выражения.

+0

Ничего себе. Спасибо, Аликс. Я дам это попробовать :) – Scott

Смежные вопросы