尝试将大型多行文件preg_split为数组

时间:2013-12-16 17:15:24

标签: php regex arrays preg-split

我有一个格式为...

的文件

file.txt的

[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...

格式与(对于那些熟悉的)smb.conf非常相似,我希望在它的末尾有一个数组“section”字符串。最后,我正在寻找一个preg_split来获取文本的每个部分并将其放入一个数组中......

Array
(
    [0] => [sectionone]
           ...
           ...
    [1] => [sectiontwo]
           ...
           ...
    [2] => [sectionthree]
           ...
           ...
)

我知道我可以逐行阅读文件并以这种方式创建解决方案,但我很顽固,并试图弄清楚它是否符合我的需要。 分组必须在'['(括号)位于任意一行的开头而且前导到下一个括号(换行符,制表符,任何字符等)的公平游戏时发生。大多数我的尝试要么没有结果,要么数组计数为1,一切都是。

 $fileString = file_get_contents( '/tmp/file.txt' );
 print_r( preg_split( "/^\[.*\]\n$/", $fileString );

...导致不受欢迎的......

Array
(
    [0] => [sectionone]
           ...
           ...
           [sectiontwo]
           ...
           ...
           [sectionthree]
           ...
           ...
}

任何帮助都会非常感激,因为我的正则表达技巧最好是初学者。提前谢谢。

3 个答案:

答案 0 :(得分:2)

请考虑使用parse_ini_file()parse_ini_string()函数,该函数已将与smb.conf格式相同的文件解析为包含配置项的数组。

例如,给定以下配置sample.ini(来自parse_ini_file() docs的示例):

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

以下代码:

$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

将产生:

Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )
)

答案 1 :(得分:2)

从正则表达式中删除^$

这导致php仅匹配字符串开头的左括号和字符串末尾的右括号。

$fileString = file_get_contents( '/tmp/file.txt' );
print_r( preg_split( "/\[.*\]\r?\n/", $fileString );

这样的事情对你来说会更好。

答案 2 :(得分:2)

你可以改用preg_match_all吗?

$fileString = '[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...';
preg_match_all("/^\[.*?(?=\n\[|\z)/ms", $fileString, $matches);
print_r($matches);

这将匹配[,直到找到\n后跟[或字符串末尾。标记ms在此处非常重要,可使^与所有行的开头匹配,并使.与新行匹配。

或分裂......

print_r(preg_split("/\n(?=\[)/", $fileString));

只有在\n后跟[匹配时才会与{{1}}匹配。