Php 正在尝试将大型多行文件拆分为数组

Php 正在尝试将大型多行文件拆分为数组,php,regex,arrays,preg-split,Php,Regex,Arrays,Preg Split,我有一个格式化为 file.txt 格式非常类似于(对于那些熟悉的)smb.conf,我希望在它的末尾有一个数组“section”字符串。最后,我希望做一个preg_分割,将文本的每一部分放入一个数组中,就像这样 Array ( [0] => [sectionone] ... ... [1] => [sectiontwo] ... ... [2] => [sectio

我有一个格式化为

file.txt 格式非常类似于(对于那些熟悉的)smb.conf,我希望在它的末尾有一个数组“section”字符串。最后,我希望做一个preg_分割,将文本的每一部分放入一个数组中,就像这样

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]
           ...
           ...
}
<> P>任何帮助都将非常感谢,因为我的正则表达式技巧是初学者最好的。谢谢。

< P>请考虑使用已经或以相同的格式将文件与 SMB.CONF>代码>解析成具有配置项的数组。

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

以下代码:

$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
        )
)

从正则表达式中删除
^
$

这导致php只匹配字符串开头的一个左括号和字符串结尾的一个右括号

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

像这样的东西应该对你更有用。

你可以用
preg\u match\u all
来代替吗

$fileString = '[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...';
preg_match_all("/^\[.*?(?=\n\[|\z)/ms", $fileString, $matches);
print_r($matches);
这将匹配
[
,直到它找到一个
\n
后跟一个
[
或在字符串的末尾。这里的标志
ms
对于使
^
匹配所有行的开头和
匹配新行非常重要

或者用分裂

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

仅当后跟
[

你只需要部分名称吗?或者你还需要每个部分中的值吗?首先,我感谢你的回答。我已经这样做了,而且它需要一个非常严格的格式。不幸的是,在我的情况下,部分标题之间可以是任意数量的可怕文本、特殊字符等…不仅仅是x等于y。我所知道的是sEUE是从括号开始的部分。好的建议,但他说它是相似的,所以如果他不一样,那么他必须改变他的格式,所以它是完全相同的。“Evan Ouch!是的,在这种情况下,你最好用自定义解析器。”BLUGEMAN91:是的,我确实注意到了这一点,这就是为什么我说要考虑这个问题。f它已经尝试过。=)@Evan尝试使用:
preg\u split(“/^\[^[^[]+\]\n$/”,$fileString)
——我认为
*
与最后一个
]
非常匹配。完全有效,但是,标题本身丢失了。尽管我可能在其他地方使用它,我还是很欣赏这个解决方案。
$fileString = '[sectionone]
...
...
[sectiontwo]
...
...
[sectionthree]
...
...';
preg_match_all("/^\[.*?(?=\n\[|\z)/ms", $fileString, $matches);
print_r($matches);
print_r(preg_split("/\n(?=\[)/", $fileString));