如何在文件中获取常量名称和常量值

时间:2012-06-25 07:06:12

标签: php

我的文件包含常量。如何获得常量名称和常量值。问题是常量值有一些时间空间。我使用file()然后使用foreach ...

读取文件

示例:

define('LNG_UTF-8',         'Universal Alphabet (UTF-8)');
define('LNG_ISO-8859-1',   'Western Alphabet (ISO-8859-1)');
define('LNG_CustomFieldsName', 'Custom Field');
define('LNG_CustomFieldsType', 'Type');

我已经尝试过:

获得常量名称:

$getConstant1 = strpos($mainFileArray[$i], '(\'');
$getConstant2 = strpos($mainFileArray[$i], '\',');              
$const = substr($mainFileArray[$i], $getConstant1 + 2, $getConstant2 - $getConstant1 - 2);

获得恒定值

$position1 = strpos($file[$i], '\',');
$position2 = strpos($file[$i], '\');');

$rest = substr($file[$i], $position1 + 3, $position2 - $position1 - 2);

但是当空间或','时没有工作......

我怎样才能让它始终有效?

2 个答案:

答案 0 :(得分:1)

与此匹配的正则表达式将是:

preg_match("/define\(\s*'([^']*)'\s*,\s*'([^']*)'\s*\)/i", $line, $match);
echo $match[1], $match[2];

请参阅http://rubular.com/r/m9plE2qQeT

但是,只有当字符串是单引号',不包含转义引号,字符串不连接等时才有效。例如,这会破坏:

define('LNG_UTF-8', "Universal Alphabet (UTF-8)");
define('LNG_UTF-8', 'Universal \'Alphabet\' (UTF-8)');
define('LNG_UTF-8', 'Universal Alphabet ' . '(UTF-8)');
// and many similar

要使至少前两个工作,您应该根据PHP解析规则使用token_get_all 解析 PHP文件,然后浏览生成的标记并提取您需要的值。
要使所有案例都有效,您需要实际评估 PHP代码,即include文件,然后只需将常量作为常量访问PHP。

答案 1 :(得分:1)

您应该使用get_defined_constants()功能。它返回一个关联数组,其中包含所有常量及其值的名称。