Итак, у меня есть концепция, как это сделать, но на самом деле реализация меня — немного тупик для меня; в основном из-за отсутствия у меня опыта регулярных выражений — но давайте разберемся с этим.
Я хотел бы проанализировать php-файл, который может содержать что-то вроде следующего:
<?php
function Something()
{
}
?>
<html>
<body>
<? Something(); ?>
</body>
</html>
<?php
// Some more code or something
?>
Если интерпретировать точно — вышеупомянутое — бесполезная уловка — но это хороший пример того, что я хотел бы иметь возможность анализировать или интерпретировать …
Идея состоит в том, что я прочитал бы содержимое вышеупомянутого файла и разбил бы его на упорядоченный массив его соответствующих частей; отслеживая «тип» каждого «сегмента», чтобы я мог либо просто повторить его, либо запустить «eval ()» для него.
По сути, я хотел бы получить массив примерно так:
$FileSegments = array();
$FileSegments[0]['type'] = "PHP";
$FileSegments[0]['content'] = "function Something()
{
}";
$FileSegments[1]['type'] = "HTML";
$FileSegments[1]['content'] = "<html>
<body>";
$FileSegments[2]['type'] = "PHP";
$FileSegments[2]['content'] = "Something();"
И так далее…
Первоначальная идея состояла в том, чтобы просто «включить ()» или «требовать ()» рассматриваемого файла и извлечь его вывод из буфера вывода — но до меня дошло, что я хотел бы иметь возможность внедрить некоторый «верхний уровень» переменные в каждый из этих файлов, прежде чем оценивать код. Чтобы сделать это, мне пришлось бы ‘eval ()’ мой внедренный код, с содержимым файла после указанной инъекции — но для того, чтобы сделать это с возможностью обработки необработанного HTML в файле, мне пришлось бы в основном написать временный клон всего файла, в котором только что вставленный код был написан до фактического содержимого … Громоздкий и медленный.
Я надеюсь, что вы все здесь следите … Если нет, я могу уточнить …
Единственное, что я чувствую, я должен отметить, прежде чем завершить этот вопрос; является то, что я хотел бы сохранить любые переменные или символы в целом (например, функцию ‘Something ()), созданную, например, в сегментах 0 и 2, и передать их в сегмент’ 4 ‘… Я чувствую, что это может быть достижимым, используя метод извлечения, а затем вручную записывать эти фрагменты данных перед выполнением моего следующего сегмента — но опять-таки я немного стреляю в этом.
Если у кого-то есть лучший подход, или он может дать мне краткий код о том, как просто извлечь эти «сегменты» из файла, я был бы в восторге.
ура
ETA: Меня осенило, что я, вероятно, могу задать этот вопрос немного проще: если не существует «простого» способа сделать это, есть ли способ обработать строку в точный так же, как ‘require ()’ и ‘include ()’ обрабатывают файл?
<?php
$str = file_get_contents('filename.php');
// get values from starting characters
$php_full = array_filter(explode('<?php', $str));
$php = array_filter(explode('<?', $str));
$html = array_filter(explode('?>', $str));// remove values after last expected characters
foreach ($php_full as $key => $value) {
$php_full_result[] = substr($value, 0, strpos($value, '?>'));
}
foreach ($php as $key => $value) {
if( strpos($value,'php') !== 0 )
{
$php_result[] = substr($value, 0, strpos($value, '?>'));
}
}
$html_result[] = substr($str, 0, strpos($str, '<?'));
foreach ($html as $key => $value) {
$html_result[] = substr($value, 0, strpos($value, '<?'));
}
$html_result = array_filter($html_result);
echo '<pre>';
print_r($php_full_result);
echo '</pre>';
echo '<pre>';
print_r($php_result);
echo '</pre>';
echo '<pre>';
var_dump($html_result);
echo '</pre>';
?>
Это даст вам 3 массива файловых сегментов, которые вы хотите, не того формата, который вы хотели, но вы можете легко изменить эти массивы в соответствии с вашими потребностями.
Для «я хотел бы разбить все мои переменные $ GLOBALS на их« простые »имена», которую вы можете использовать экстракт лайк
extract($GLOBALS);
Других решений пока нет …