我有一个格式为...
的文件[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]
...
...
}
任何帮助都会非常感激,因为我的正则表达技巧最好是初学者。提前谢谢。
答案 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}}匹配。