如何从格式化的字符串/ CLI输出中提取特定标记?

时间:2013-12-28 11:05:46

标签: php regex

我有一个字符串数组,其中“columns”被空格分隔:

Array
(
    [0] => 911         (info)    YES   NO   D  1236     UNKNOWN    
    [1] => 910         (no i)    YES   NO   D  1236        NOTE    
    [2] => 909         (no i)    YES   NO   D  1236     UNKNOWN    
    [3] => 742         (info)    YES   NO   D  1236        NOTE    
    [4] => 741/741     (info)    YES   NO   D  1236        NOTE    
    [5] => 740/740     (info)    YES   NO   D  1236     UNKNOWN    
    [6] => john        (no i)    YES   NO   D  0           NOTE    
)

我只想打印最后一行注意的每一行中的第一项,

910
742
741       // note that the first token is 741/741 in this case
john

最简单的方法是什么?

3 个答案:

答案 0 :(得分:1)

您应该考虑更改阵列格式。在这里,幸运的是,您要打印的“列”位于相同的位置,并至少由一个空格分隔。您可以做的思考I图像是作为字符串位置的NOTE,因为整个值是一个字符串,并且只通过explode()打印第一部分

<?php
$arr = Array
(
    0 => '911         (info)    YES   NO   D  1236     UNKNOWN  ',  
    1 => '910         (no i)    YES   NO   D  1236        NOTE',   
    2 => '909         (no i)    YES   NO   D  1236     UNKNOWN',   
    3 => '742         (info)    YES   NO   D  1236        NOTE',
    4 => '741/741     (info)    YES   NO   D  1236        NOTE',
    5 => '740/740     (info)    YES   NO   D  1236     UNKNOWN',    
    6 => 'john        (no i)    YES   NO   D  0           NOTE'   
);

foreach ($arr as $val) {
    if(strpos($val, 'NOTE')) {
        $val = explode(' ', $val);
        echo $val[0] . "<br />";
    }
}

输出:

910
742
741/741
john

或者,如果您也想使用/作为分隔符(似乎您在/free space之后不需要任何内容​​,则可以使用带有preg_split的多个分隔符(正则表达式)

foreach ($arr as $val) {
    if(strpos($val, 'NOTE')) {
        $val = preg_split("/[\/\ ]+/", $val);
        echo $val[0] . "<br />";
    }
}

答案 1 :(得分:0)

尝试这样的事情......

<?php
$arr=Array
(
    0 => '911         (info)    YES   NO   D  1236     UNKNOWN',
    1 => '910         (info)    YES   NO   D  1236        NOTE',
    2 => '909         (info)    YES   NO   D  1236     UNKNOWN',
    3 => '742         (info)    YES   NO   D  1236        NOTE',
    4 => '741/741     (info)    YES   NO   D  1236        NOTE',
    5 => '740/740     (info)    YES   NO   D  1236     UNKNOWN',
    6 => 'john        (info)    YES   NO   D  0           NOTE'
);

$new_arr = array();
function processFunc($v)
{
    global $new_arr;
    if(strpos($v,'NOTE')!==false)
    {
        if(strpos($v,'/')!==false)
        {
            $new_arr[]=explode('/',$v)[0];

        }
        else
        {
            $new_arr[]=explode(' ',$v)[0];
        }
    }
}

$some_arr=array_map('processFunc',$arr);
echo $string=implode('<br>',$new_arr);

输出:

910
742
741
john

答案 2 :(得分:0)

preg_match_all('/^\w+(?=.*NOTE)/m', implode("\n", $array), $matches);
print_r($matches[0]);

: demo

正则表达式说明: Regex Visualisation

/正则表达式分隔符

^在行的开头断言位置

\w+匹配任何字词[a-zA-Z0-9_]

  • 量词:一个和无限次之间,尽可能多次,根据需要回馈[贪婪]

(?=.*NOTE)肯定前瞻 - 断言下面的正则表达式可以匹配

  • .*匹配任何字符(换行符除外)

    • 量词:和无限次之间,尽可能多次,根据需要回馈[贪婪]

      < / LI>
    • NOTE字符匹配字符注意(区分大小写)

/

m修饰符:多行。

  • 使^$与每行的开头/结尾相匹配(不仅是字符串的开头/结尾)