2011-11-29 81 views
0

我创建了一个类似于drupal中的.info文件。用PHP阅读.info文件

#Comment 
Template Name = Valley 

styles[] = styles/styles.css, styles/media.css 
scripts[] = js/script.js 

我想用PHP获取每个变量及其值。例如,我想将Template Name的值放到一个名为Template Name的PHP变量中,并且如果存在一个值,则将styles[]的值放入一个数组中。

我还需要避免它在文本前定义为散列#的评论。

这似乎很多问,bt我真的不知道如何去做这件事。如果有人有解决方案,我会非常感激,但是如果有人能够指出我的方向是正确的,那将会很有帮助。

感谢先进!

+0

看起来像'.ini'文件格式。那是Drupal用来读取它的机会吗? – mario

+0

我已经创建了一个函数,这里是我输入到函数 - 'split_sheets(strstr($ doc,“styles []”))''。 '$ doc'是一个'fread'。然后该函数用'explode'分割字符串两次,第一次搜索一个'='分裂,并用''爆炸搜索','。这对一条线有效,但是当我加入时,它们彼此冲突。 – PapaSmurf

+0

我不确定drupal如何读取它。 – PapaSmurf

回答

1

如果你可以稍微adkust您的信息的文件,你可以使用内置的PHP函数:

http://php.net/manual/en/function.parse-ini-file.php

#Comment 
TemplateName = Valley 

styles[] = "styles/styles.css" 
styles[] = "styles/media.css" 
scripts[] = "js/script.js" 

这将导致数组

+0

这可能是最好的做法!我会先给它并报告,谢谢! – PapaSmurf

+0

这已经成功了,谢谢! – PapaSmurf

0

的Drupal是一个很好的提示:

function drupal_parse_info_file($filename) { 
    $info = array(); 
    $constants = get_defined_constants(); 

    if (!file_exists($filename)) { 
    return $info; 
    } 

    $data = file_get_contents($filename); 
    if (preg_match_all(' 
    @^\s*       # Start at the beginning of a line, ignoring leading whitespace 
    ((?: 
     [^=;\[\]]|     # Key names cannot contain equal signs, semi-colons or square brackets, 
     \[[^\[\]]*\]     # unless they are balanced and not nested 
    )+?) 
    \s*=\s*       # Key/value pairs are separated by equal signs (ignoring white-space) 
    (?: 
     ("(?:[^"]|(?<=\\\\)")*")|  # Double-quoted string, which may contain slash-escaped quotes/slashes 
     (\'(?:[^\']|(?<=\\\\)\')*\')| # Single-quoted string, which may contain slash-escaped quotes/slashes 
     ([^\r\n]*?)     # Non-quoted string 
    )\s*$       # Stop at the next end of a line, ignoring trailing whitespace 
    @msx', $data, $matches, PREG_SET_ORDER)) { 
    foreach ($matches as $match) { 
     // Fetch the key and value string 
     $i = 0; 
     foreach (array('key', 'value1', 'value2', 'value3') as $var) { 
     $$var = isset($match[++$i]) ? $match[$i] : ''; 
     } 
     $value = stripslashes(substr($value1, 1, -1)) . stripslashes(substr($value2, 1, -1)) . $value3; 

     // Parse array syntax 
     $keys = preg_split('/\]?\[/', rtrim($key, ']')); 
     $last = array_pop($keys); 
     $parent = &$info; 

     // Create nested arrays 
     foreach ($keys as $key) { 
     if ($key == '') { 
      $key = count($parent); 
     } 
     if (!isset($parent[$key]) || !is_array($parent[$key])) { 
      $parent[$key] = array(); 
     } 
     $parent = &$parent[$key]; 
     } 

     // Handle PHP constants. 
     if (isset($constants[$value])) { 
     $value = $constants[$value]; 
     } 

     // Insert actual value 
     if ($last == '') { 
     $last = count($parent); 
     } 
     $parent[$last] = $value; 
    } 
    } 

    return $info; 
} 

Source,这个功能是Drupal的代码库的一部分,drupal's license适用,用于这里只是文档目的。

+0

谢谢你,我想我只是使用PHP的解析ini函数。这可能对别人有用,谢谢! – PapaSmurf

1

如果你是之后是“类似”的东西,你可以看看parse_ini_file()函数。