模式匹配后单步执行文件

时间:2016-02-05 20:06:28

标签: php regex

我正在尝试从文本块之间的文件中获取名字和姓氏字段。我已经尝试过PHP,awk和Perl但是无法得到我想要的东西。

数据:

[ABC-001]
first=firstabc001
phone=sometext
last=sometext

[DEF-001]
phone=sometext
last=sometext
first=firstdef001

[ABC-002]
phone=sometext
first=firstabc002
last=sometext

[GHI-001]
first=firstghi001
phone=sometext
last=sometext

函数调用:get_firstname($ W = ABC,$ N = 002)

搜索并返回:firstabc002

我正在尝试创建一个PHP站点,它从我发送它的值中获取名字,因为值存储在一个平面文件中。

我不一定关心哪种语言可以做到这一点,只要我可以从PHP调用它(这应该不是问题)。

我已经尝试过PHP,awk和Perl但是无法使用它。

我只需要它来返回值。我不确定是否应该将平面文件作为一个大字符串,一个数组或循环读入并获取每一行,然后在到达[ABC-002]标题后逐步执行。

我已经尝试过在线正则表达式实用程序以及php preg_match,我无法使用array [n]来显示fisrtabc002结果

感谢那些提供帮助答复的人。我不知道parse_ini_(file | string)http://php.net/manual/en/function.parse-ini-file.php

当我进行进一步测试时,我会稍微标出最佳答案。

我喜欢perl和awk选项,因为我在不同的时间需要这些功能,现在它们都在我的技巧包里。

4 个答案:

答案 0 :(得分:2)

解析它......

$sections = parse_ini_string($iniString, true);
foreach($sections as $section) {
    echo "{$section['first']}\n";
}

如果您想要first部分中的ABC-102项,那么:

$sections = parse_ini_string($initString, true);
foreach($sections as $header => $section) {
    if ($header === 'ABC-102') {
        echo $section['first'];
        break;
    }
}

答案 1 :(得分:2)

使用parse_ini您可以编写类似的代码:

function get_firstname( $w, $n ){
    $ini_array = parse_ini_file("test.ini", true);
    if($ini_array["$w-$n"] AND $ini_array["$w-$n"]["first"]){
        return "First Name:" . $ini_array["$w-$n"]["first"];
    }else{
        return "Not Found";
    }
}

echo get_firstname("ABC","002");
//First Name:firstabc002

答案 2 :(得分:1)

前提是,我找到你了,你正在搜索以$ W开头的部分以$ N结尾的名字,我会在perl中这样做:

更新:根据上面的评论,您搜索以$ W开头并以$ N结尾的部分,即[$W-$N]

#!/usr/bin/env perl

use strict;
use warnings;

# set input record separator to an empty line:
$/ = "\n\n";

my $W = 'ABC';
my $N = '002';

while ( my $record = <DATA> ) {
    if ( $record =~ /\[$W-$N\].*first=(.*?)\n/s ) {
        print "first='$1'\n";
    }
}

__DATA__
[ABC-001]
first=firstabc001
phone=sometext
last=sometext

[DEF-001]
phone=sometext
last=sometext
first=firstdef001

[ABC-102]
phone=sometext
first=firstabc002
last=sometext

[GHI-001]
first=firstghi001
phone=sometext
last=sometext

答案 3 :(得分:1)

使用awk即可:

awk -F= -v W='ABC' -v N='002' '$0 == "[" W "-" N "]"{p=1}
   p && $1 == "first"{print $2; p=0}' file

<强>输出:

firstabc002