用PHP读取ini的正则表达式

用PHP读取ini的正则表达式,php,regex,parsing,Php,Regex,Parsing,示例ini文件是 [SAMPLE.jpg] faces=rect64(c18f4c8ef407851e),d4ff0a020be5c3c0;rect64(534a06d429ae627),dff6163dfd9d4e41;rect64(b9c100fae46b3046),e1059dcf6672a2b3;rect64(7b5105daac3a3cf4),4fc7332c107ffafc;rect64(42a036a27062a6c),ef86c3326c143248;rect64(31f4efe

示例ini文件是

[SAMPLE.jpg]
faces=rect64(c18f4c8ef407851e),d4ff0a020be5c3c0;rect64(534a06d429ae627),dff6163dfd9d4e41;rect64(b9c100fae46b3046),e1059dcf6672a2b3;rect64(7b5105daac3a3cf4),4fc7332c107ffafc;rect64(42a036a27062a6c),ef86c3326c143248;rect64(31f4efe3bd68fd8),90158b3d3b65dc9b;rect64(327904e0614d390d),43cbda6e92fcb63e;rect64(4215507584ae9b8c),15b6a967e857f334;rect64(895d4efeb8b68425),5c4ff70ac70b27d3
backuphash=285
[Size.JPG]
faces=rect64(f73101cd554ca7f),43cbda6e92fcb63e
backuphash=38150
[ints.jpg]
faces=rect64(45c213047999593c),e1059dcf6672a2b3
backuphash=19801
[SC.jpg]
faces=rect64(993f2dfdab7f5166),e1059dcf6672a2b3;rect64(4b002f365a004c1b),ef86c3326c143248;rect64(bbffbb9fcb7fda25),ef86c3326c143248;rect64(bbbf9b10cb7fb996),90158b3d3b65dc9b;rect64(bbffdc97cb3ffa4c),4fc7332c107ffafc;rect64(5ec0306f734058b9),43cbda6e92fcb63e;rect64(65c06969827fa12b),15b6a967e857f334;rect64(bbff59f2cbbf7878),15b6a967e857f334;rect64(bbff7a81cb3f989f),43cbda6e92fcb63e
backuphash=9829
[karate.jpg]
faces=rect64(20823e7a6186b30b),15b6a967e857f334;rect64(92cb3e7ad34cb30b),15b6a967e857f334
backuphash=34154
模式识别算法

[$name_of_picture]
faces=rect64($hex1_1),$hex1_2;rect64($hex2_1),hex2_2;....rect64($hexn_1),hexn_2;
我只想阅读由$var_name分配的部分。。在上述代码中。我该怎么做呢

更新

使用parseini

<?php
//code from php.net

// Parse without sections
$ini_array = parse_ini_file("pic.ini");
print_r($ini_array);

// Parse with sections
$ini_array = parse_ini_file("pic.ini", true);
print_r($ini_array);

?>
输出

警告:上的pic.ini解析错误 第26行C:\tezt\up.php中的第2行

警告:上的pic.ini解析错误 第30行C:\tezt\up.php中的第2行

更新2

输出

数组[SAMPLE.jpg]=>数组 [脸]=> rect64c18f4c8ef407851e,d4ff0a020be5c3c0;rect64534a06d429ae627,dff6163dfd9d4e41;rect64b9c100fae46b3046、e1059dcf6672a2b3;rect647b5105daac3a3cf4,4fc7332c107ffafc;RECT644A036A27062A6C,ef86c3326c143248;RECT6431F4EFE3BD68FD890158B3D3B65DC9B;rect64327904e0614d390d,43cbda6e92fcb63e;rect644215507584ae9b8c、15b6a967e857f334;rect64895d4efeb8b68425,5c4ff70ac70b27d3 [backuphash]=>285[Size.JPG]=> 数组[面]=> RECT64F7310CD554CA7F,43cbda6e92fcb63e [backuphash]=>38150[ints.jpg]=> 数组[面]=> rect6445c213047999593c,e1059dcf6672a2b3 [backuphash]=>19801[SC.jpg]=> 数组[面]=> rect64993f2dfdab7f5166、e1059dcf6672a2b3;rect644b002f365a004c1b,ef86c3326c143248;RECT64BFFBB9FCB7FDA25,ef86c3326c143248;RECT64BF9B10CB7FB99690158B3B3B65DC9B;rect64bbffdc97cb3ffa4c,4fc7332c107ffafc;rect645ec0306f734058b9,43cbda6e92fcb63e;rect6465c06969827fa12b、15b6a967e857f334;RECT64BFF59F2CBBF7878,15b6a967e857f334;RECT64BFF7A81CB3F989F,43cbda6e92fcb63e [backuphash]=>9829[karate.jpg]=> 数组[面]=> rect6420823e7a6186b30b、15b6a967e857f334;rect6492cb3e7ad34cb30b、15b6a967e857f334 [备份哈希]=>34154

到目前为止还不错。谢谢你们。 这个问题与我的另一个问题有关
PHP有一个用于解析INI文件的内置函数

PHP有一个用于解析INI文件的内置函数

并非所有与字符串相关的问题都最好用正则表达式来回答

在本例中,PHP内置了一些功能,可以为您实现这一点


并非所有与字符串相关的问题都最好用正则表达式来回答

在本例中,PHP内置了一些功能,可以为您实现这一点

要详细介绍Pekka的:

通过$ini解析文件=解析ini文件,true 选择面=。。。按图像名称:$str=$ini[$name\u of\u图片]['faces'] 在…上 重复这些,然后继续爆炸, 您可能需要确保图片和指示面的$name部分存在,请参阅。

详细说明Pekka的:

通过$ini解析文件=解析ini文件,true 选择面=。。。按图像名称:$str=$ini[$name\u of\u图片]['faces'] 在…上 重复这些,然后继续爆炸,
您可能希望确保图片和指令面的$name部分存在,请参阅。

如果您想知道如何使用正则表达式解析它,或者您可能懒得编写相对较长的代码,请参阅这里的正则表达式:

^\s*\[([^\]]+)\]
您可以在替换部分中使用$1引用方括号内的文本,如果在搜索部分中引用,则可以使用\1引用方括号内的文本


但是,我同意您应该使用内置PHP库来解析严肃项目的INI文件。

如果您对如何使用regex解析它感到好奇,或者您可能懒得编写相对较长的代码,那么这里使用的是regex:

^\s*\[([^\]]+)\]
您可以在替换部分中使用$1引用方括号内的文本,如果在搜索部分中引用,则可以使用\1引用方括号内的文本


但是,我同意您应该使用内置PHP库来解析重要项目的INI文件。

请从工具中检查以下INI正则表达式:


请从工具中检查以下ini正则表达式:


我的函数基于OP的函数,但在某些点上是固定的。它将.ini文本内容解析为数组。例如,它不处理类别值,正确处理值周围的反引号,并允许空行

function stripQuotes($text) {
    return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
}


function ini2array($s) {
    $ini=explode("\n", $s);

    // to hold the categories, and within them the entries
    $cats = array();
    $last = '';

    foreach ($ini as $i) {
        if (@preg_match('/\[(.+)\]/', $i, $matches)) {
            $last=stripQuotes(trim($matches[1]));
        } elseif (@preg_match('/(.+)=(.+)/', $i, $matches)) {
            $key=stripQuotes(trim($matches[1]));
            if (strlen($key)>0) {
                $val=stripQuotes(trim($matches[2]));
                if (strlen($last) > 0) {
                    $cats[$last][$key]=trim($val);
                } else {
                    $cats[$key]=trim($val);
                }
            }
        }
    }

    return $cats;
}

我的函数基于OP的函数,但在某些点上是固定的。它将.ini文本内容解析为数组。例如,它不处理类别值,正确处理值周围的反引号,并允许空行

function stripQuotes($text) {
    return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
}


function ini2array($s) {
    $ini=explode("\n", $s);

    // to hold the categories, and within them the entries
    $cats = array();
    $last = '';

    foreach ($ini as $i) {
        if (@preg_match('/\[(.+)\]/', $i, $matches)) {
            $last=stripQuotes(trim($matches[1]));
        } elseif (@preg_match('/(.+)=(.+)/', $i, $matches)) {
            $key=stripQuotes(trim($matches[1]));
            if (strlen($key)>0) {
                $val=stripQuotes(trim($matches[2]));
                if (strlen($last) > 0) {
                    $cats[$last][$key]=trim($val);
                } else {
                    $cats[$key]=trim($val);
                }
            }
        }
    }

    return $cats;
}

先告诉我:-S记住$process\u sections=true second arg。事实上,在这之后,它会爆炸;等比正则表达式可读性和可维护性更强,甚至可能更快。@Wrikken啊,我只是把这个作为一个答案。嗯,不是我的日子:我在第2行遇到了一个解析错误。在尝试解析上述内容时file@Pekka我用一个使用regex的工作函数更新了这个问题。请发表评论。快告诉我:-S记住$process_sections=true second arg。确实如此,在那之后爆发;等比正则表达式可读性和可维护性更强,甚至可能更快。@Wrikken啊,我只是把这个作为一个答案。嗯,不是我的日子:我在第2行遇到了一个解析错误。在尝试解析上述内容时file@Pekka我用一个使用regex的工作函数更新了这个问题。做评论。是的,我知道事实上,正则表达式对于解析INI文件很有意义。然而,程序员似乎被编写代码的可能性蒙蔽了双眼
regex从来没有像现有的测试工作代码那样是一个好的选择。是的,我知道实际上,regex对于解析INI文件非常有意义。然而,程序员似乎被编写正则表达式的可能性蒙蔽了双眼,而正则表达式从来没有像现有的测试工作代码那样是一个好的选择。
function stripQuotes($text) {
    return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
}


function ini2array($s) {
    $ini=explode("\n", $s);

    // to hold the categories, and within them the entries
    $cats = array();
    $last = '';

    foreach ($ini as $i) {
        if (@preg_match('/\[(.+)\]/', $i, $matches)) {
            $last=stripQuotes(trim($matches[1]));
        } elseif (@preg_match('/(.+)=(.+)/', $i, $matches)) {
            $key=stripQuotes(trim($matches[1]));
            if (strlen($key)>0) {
                $val=stripQuotes(trim($matches[2]));
                if (strlen($last) > 0) {
                    $cats[$last][$key]=trim($val);
                } else {
                    $cats[$key]=trim($val);
                }
            }
        }
    }

    return $cats;
}