Как я могу разбить сегменты файла ‘PHP’ на необработанный PHP, и, возможно, необработанный HTML в порядке

Итак, у меня есть концепция, как это сделать, но на самом деле реализация меня — немного тупик для меня; в основном из-за отсутствия у меня опыта регулярных выражений — но давайте разберемся с этим.

Я хотел бы проанализировать 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 ()’ обрабатывают файл?

0

Решение

<?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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]