регулярное выражение — надежно получить константу PHP из файла

Последнее редактирование:
Что ж, я придумала довольно «надежное» решение 🙂 в виде (переносимой) функции, но поскольку некоторые люди здесь достаточно раздражены, не понимая проблему, и заблокировали этот вопрос (военное решение: убей то, чего не понимаешь) ), Я не могу опубликовать это здесь. Жалость.

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

define ('LNG_GSU_LNK_LBL', '[details]');
define ('LNG_METHODCROSS_GSU_CLS', 'class');
define ('GSU_METH', 'method');
define ('CROSS_GSU_ACTION_NO_REMOVE', 'не может удалить \' module \ '(is); развернуто');

Какой самый надежный метод для извлечения имен констант и значений из заданного, выбранного файла.

РЕДАКТИРОВАТЬ:

Мне нужно получить эти константы в массив, не определяя их фактически, непосредственно путем чтения файла, например:

массив ('LNG_GSU_LNK_LBL' => '[details]', 'LNG_METHODCROSS_GSU_CLS' => 'class')

… так далее

РЕДАКТИРОВАТЬ 2:
До сих пор я получил это далеко:

$ file_array = file ($ path, FILE_SKIP_EMPTY_LINES);

// внедряем lang файл в строку, удаляя php теги
$ string1 = implode ('', $ file_array);
$ string2 = str_replace (array (''), '', $ string1);

// регулярное выражение удаления содержимого между маркерами
$ regex = '/\/\*.+?\*\//si';
$ replace_with = '';
$ replace_where = $ string2;
$ string3 = preg_replace ($ regex, $ replace_with, $ replace_where);

// регулярное выражение: удалить несколько новых строк
$ string4 = preg_replace ("/ \ n + /", "\ n", $ string3);

РЕДАКТИРОВАТЬ 3:

ожидаемый результат

массив (
'LNG_GSU_LNK_LBL' => '[details]',
'LNG_METHODCROSS_GSU_CLS' => 'class',
'GSU_METH' => 'method',
'CROSS_GSU_ACTION_NO_REMOVE' => 'не может удалить \' module \ '(is); развернуть»
);

1

Решение

Если вы не хотите включать файл, вы должны использовать: token_get_all ().

В противном случае вам нужно / включить файл, содержащий их, и вы можете использовать итеративно get_defined_constants():

$all = array();

$consts = get_defined_constants();
foreach($consts as $k=>$v){
if (strpos($k,"LNG")===0 && !isset($all[$k]))
$all[$k]=$v;
}

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

2

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

Основываясь на ответе Dynamic, включите файл в другой отдельный файл, доступный через Интернет, который не загружается в ваше текущее приложение (поэтому не будет других пользовательских констант во время выполнения):

//standalone.php
include "that_file.php";

$consts = get_defined_constants(true);
$newUserConsts = $consts['user'];
echo json_encode($newUserConsts);

//within your application

$newUserConsts = json_decode(file_get_contents('http://yoursite.com/standalone.php'));

Или, если вы не можете сделать отдельный файл, доступный через Интернет:

$consts = get_defined_constants(true);
$existingUserConsts = $consts['user'];

include "that_file.php";

$consts = get_defined_constants(true);
$newUserConsts = $consts['user'];

var_dump(array_diff_key($newUserConsts, $existingUserConsts));
1