用正则表达式提取字符串

时间:2012-11-10 22:09:27

标签: php regex text-files echo

在文本文件中,我有以下字符串:

 ID  |      LABEL       | A |   B  | C
--------------------------------------
9999 | Oxygen Isotopes  |   | 0.15 | 1 
8733 | Enriched Uranium |   | 1    | 1 

我想使用正则表达式提取每行的字段IDLABEL

我如何实现它?

7 个答案:

答案 0 :(得分:2)

我不确定你为何坚持使用正则表达式。

由于列似乎被|分隔符号,似乎使用PHP函数explode将是一个更容易的解决方案。

您可以遍历这些行,并使用典型的数组索引表示法引用每一列,例如:$line[0]$line[1]分别用于ID和LABEL。

答案 1 :(得分:1)

我怀疑正则表达式是最好的解决方案。

尝试将文本文件分隔成一个行数组(这可能会也可能不会,这取决于您创建txt文件的计算机的操作系统)

$lines = explode($text, "\n");
$final_lines = array();

foreach ($lines as $line) {
    $parts = explode($line, " | ");
    $final_lines[] = $parts;
}

现在,您可以通过行号和列访问所有数据,例如

$final_lines[2][0]

将包含8733。

答案 2 :(得分:0)

您可以在每一行使用preg_split

$array = preg_split(`/\s*\|\s*/`, $inputLine, 2);

然后在djdy的回答中,ID将位于$array[0]中,标签位于$array[1]

答案 3 :(得分:0)

正则表达式可能不是最好的方法。我在每一行读取一个字符串,并使用String.explode(“|”,input)来创建一个字符串数组。 0索引是您的ID,1索引是您的标签,如果需要,依此类推A,B和C.这是一个比使用正则表达式更强大的解决方案。

获取ID的正则表达式可能类似于

\d{4}  |

你可以为标签字段做类似的事情,再次出错,这不像使用爆炸那样强大。

答案 4 :(得分:0)

尝试

$str = file_get_contents($filename);
preg_match_all('/^\s*(\d*)\s*\|\s*(.*?)\s*\|/m', $str, $matches);
// $matches[1] will have ids
// $matches[2] will have labels 

答案 5 :(得分:0)

不需要正则表达式:

<?php
$file = file('file.txt');

$ret = array();
foreach($file as $k=>$line){
    if($k<2){continue;}

    list($ret['ID'][],
         $ret['LABEL'][],
         $ret['A'][],
         $ret['B'][],
         $ret['C'][]) = explode('|',$line);
}

print_r($ret);

//Label: Oxygen Isotopes ID:9999 
echo 'Label: '.$ret['LABEL'][0].' ID:'.$ret['ID'][0];

/*
Array
(
    [C] => Array
        (
            [0] =>  1 

            [1] =>  1 
        )

    [B] => Array
        (
            [0] =>  0.15 
            [1] =>  1    
        )

    [A] => Array
        (
            [0] =>    
            [1] =>    
        )

    [LABEL] => Array
        (
            [0] =>  Oxygen Isotopes  
            [1] =>  Enriched Uranium 
        )

    [ID] => Array
        (
            [0] => 9999 
            [1] => 8733 
        )

)
*/
?>

答案 6 :(得分:0)

虽然这不是在这里使用正则表达式的最佳方法,但可能就像这样

preg_match_all("/(\d{4}.?)\|(.*?)\|/s", $data, $matchs)

$matches的第2和第3个索引将包含所需的数据