diff --git a/.phan/config.php b/.phan/config.php index a06886d..6e1366f 100644 --- a/.phan/config.php +++ b/.phan/config.php @@ -78,7 +78,8 @@ return [ // to parse, but not analyze "exclude_analysis_directory_list" => [ 'vendor', - 'test' + 'test', + 'tmp' ], 'exclude_file_list' => [ ], diff --git a/Readme.md b/Readme.md index 56a498f..a3ca819 100644 --- a/Readme.md +++ b/Readme.md @@ -61,6 +61,29 @@ DOUBLE="I will be used" DOUBLE="This will be ignored" ``` +A prefix name can be set with `[PrefixName]`. Tne name rules are like for variables, but spaces +are allowed, but will be converted to "_". +The prefix is valid from the time set until the next prefix block appears or the file ends. + +Example + +```ini +FOO="bar" +FOOBAR="bar bar" +[SecitonA] +FOO="other bar" +FOOBAR="other bar bar" +``` + +Will have environmen variables as + +```php +$_ENV["FOO"]; +$_ENV["FOOBAR"]; +$_ENV["SecitonA.FOO"]; +$_ENV["SecitonA.FOOBAR"]; +``` + ## Development ### Phan diff --git a/src/DotEnv.php b/src/DotEnv.php index 6dd878c..01868f8 100644 --- a/src/DotEnv.php +++ b/src/DotEnv.php @@ -22,6 +22,9 @@ class DotEnv * if there are two variables with the same name only the first is used * variables are case sensitive * + * [] Grouping Block Name as prefix until next or end if set, + * space replaced by _, all other var rules apply + * * @param string $path Folder to file, default is __DIR__ * @param string $env_file What file to load, default is .env * @return int -1 other error @@ -56,10 +59,14 @@ class DotEnv $status = 1; $block = false; $var = ''; + $prefix_name = ''; while ($line = fgets($fp)) { - // main match for variable = value part - if (preg_match("/^\s*([\w_.]+)\s*=\s*((\"?).*)/", $line, $matches)) { - $var = $matches[1]; + // [] block must be a single line, or it will be ignored + if (preg_match("/^\s*\[([\w_.\s]+)\]/", $line, $matches)) { + $prefix_name = preg_replace("/\s+/", "_", $matches[1]) . "."; + } elseif (preg_match("/^\s*([\w_.]+)\s*=\s*((\"?).*)/", $line, $matches)) { + // main match for variable = value part + $var = $prefix_name . $matches[1]; $value = $matches[2]; $quotes = $matches[3]; // write only if env is not set yet, and write only the first time diff --git a/test/phpUnitTests/DotEnvTest.php b/test/phpUnitTests/DotEnvTest.php index 77d4385..ecb01df 100644 --- a/test/phpUnitTests/DotEnvTest.php +++ b/test/phpUnitTests/DotEnvTest.php @@ -60,6 +60,8 @@ final class DotEnvTest extends TestCase 'HAS_COMMENT_NO_QUOTES_SPACE' => 'Comment at end no quotes and space', 'HAS_COMMENT_NO_QUOTES_NO_SPACE' => 'Comment at end no quotes no space', 'COMMENT_IN_TEXT_QUOTES' => 'Foo bar # comment in here', + 'HAS_EQUAL_NO_QUITES' => 'Is This = Valid', + 'HAS_EQUAL_QUITES' => 'Is This = Valid', 'FAILURE' => 'ABC', 'SIMPLEBOX' => 'A B C', 'TITLE' => '1', @@ -87,6 +89,8 @@ final class DotEnvTest extends TestCase '__FOOFOO' => 'f ', 123123 => 'number', 'EMPTY' => '', + 'Var_Test.TEST' => 'Block 1 D', + 'OtherSet.TEST' => 'Block 2 D', ]; // 0: folder relative to test folder, if unset __DIR__ // 1: file, if unset .env diff --git a/test/phpUnitTests/dotenv/test.env b/test/phpUnitTests/dotenv/test.env index 46d3456..d0e9421 100644 --- a/test/phpUnitTests/dotenv/test.env +++ b/test/phpUnitTests/dotenv/test.env @@ -10,6 +10,8 @@ HAS_COMMENT_QUOTES_NO_SPACE="Comment at end with quotes no space"# Comment QES HAS_COMMENT_NO_QUOTES_SPACE=Comment at end no quotes and space # Comment NQE HAS_COMMENT_NO_QUOTES_NO_SPACE=Comment at end no quotes no space# Comment NQES COMMENT_IN_TEXT_QUOTES="Foo bar # comment in here" +HAS_EQUAL_NO_QUITES=Is This = Valid +HAS_EQUAL_QUITES="Is This = Valid" FAILURE = ABC SIMPLEBOX= A B C TITLE=1 @@ -47,3 +49,10 @@ SUPERLINE= EMPTY= = flase asfasdf +# BLOCK TESTS +[Var Test] +TEST="Block 1 D" +[OtherSet] +TEST="Block 2 D" +[Ignore-Invalid-Block] +TEST="Block 3 D"