Php 如何从格式化字符串/CLI输出中提取特定令牌?

Php 如何从格式化字符串/CLI输出中提取特定令牌?,php,regex,Php,Regex,我有一个字符串数组,其中“列”被空格分割: 数组 ( [0]=>911(信息)是否D 1236未知 [1] =>910(否i)是否D 1236注释 [2] =>909(否i)是否D 1236未知 [3] =>742(信息)是否D 1236注释 [4] =>741/741(信息)是否D 1236注释 [5] =>740/740(信息)是否D 1236未知 [6] =>约翰(否i)是否D 0音符 ) 我只想打印每行末尾有注释的第一项,即 910 742 741//注意,在这种情况下,第一个令牌是7

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

数组
(
[0]=>911(信息)是否D 1236未知
[1] =>910(否i)是否D 1236注释
[2] =>909(否i)是否D 1236未知
[3] =>742(信息)是否D 1236注释
[4] =>741/741(信息)是否D 1236注释
[5] =>740/740(信息)是否D 1236未知
[6] =>约翰(否i)是否D 0音符
)
我只想打印每行末尾有注释的第一项,即

910
742
741//注意,在这种情况下,第一个令牌是741/741
厕所

最简单的方法是什么?

试试这样的方法

<?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);

<>你应该考虑改变你的数组格式。幸运的是,在这里,要打印的“列”位于同一位置,并且至少用一个空格隔开。您可以做的think I图像是将NOTE作为字符串位置进行测试,因为整个值是一个字符串,并通过explode()只打印第一部分

或者,如果您还想使用
/
作为分隔符(似乎在
/
可用空间之后不需要任何东西),您可以使用带有preg_split的多个分隔符(regex)

foreach($arr as$val){
如果(STRPO($val,'NOTE')){
$val=preg\u split(“/[\/\]+/”,$val);
echo$val[0]。“
”; } }
preg_match_all('/^\w+(?=.*NOTE)/m',内爆(“\n”,$array),$matches);
打印($matches[0]);

正则表达式解释:

/
正则表达式分隔符

^
在行首断言位置

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

  • 量词:在一次和无限次之间,尽可能多地,
    根据需要回馈[贪婪]
(?=.*注意)
正向前瞻-断言下面的正则表达式可以匹配

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

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

    • NOTE
      按字面意思匹配字符注释(区分大小写)

/

m
修改器:多行

  • 使
    ^
    $
    匹配每行的开始/结束
    (不仅仅是字符串的开始/结束)

你是通过用空格分割值来制作表格的?!你听说过面向对象编程或多维数组吗?这只是其他应用程序的一个示例输出。值可能不同。你是如何获得输出的?因此你只能得到一个字符串数组?输出可能只是文本,而不是数组的一个元素。他想要包含
注释的记录,也不是前4:)OP需要第3行作为
741
,而不是
741/741
:)它没有设置为规则:)他显示了示例输出,但没有说明,如果他想要
//code>的值具有规则:P但是,可以使用正则表达式。我添加了一个preg_split的示例:)谢谢您的支持remark@Driver抱歉-我从未注意到在您的示例中,行尾也有空格-我已在我的正则表达式示例中删除了
$
,因此现在应该匹配。此解决方案似乎是最方便的。:)但是有一件事,我如何将数组从数组([0]=>line1[1]=>line2)更改为$array=array('line1','line2')@驱动程序我真的不知道你的意思-你指的是输出吗<代码>打印\r
只是一个调试工具。在本例中,新数组是
$array=$matches[0]我不知道如何在输入中使我的数组看起来像你的数组。在您的示例中,它是这样的:$array=array('line1','line2');在我的例子中,它是一种不同的格式:数组([0]=>line1[1]=>line2)@Driver您问题中的“数组”看起来像一个数组的输出,对吗?键是隐式的-您只需将
$array
变量替换为代码中实际变量的名称。如果您遇到问题,那么我不能100%确定您在看什么-您可以将您的代码发布到网站上,或者使用实际的代码片段更新您的问题,以便我了解您的意思。
910
742
741
john
<?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
foreach ($arr as $val) {
    if(strpos($val, 'NOTE')) {
        $val = preg_split("/[\/\ ]+/", $val);
        echo $val[0] . "<br />";
    }
}