在文本文件中,我有以下字符串:
ID | LABEL | A | B | C
--------------------------------------
9999 | Oxygen Isotopes | | 0.15 | 1
8733 | Enriched Uranium | | 1 | 1
我想使用正则表达式提取每行的字段ID
和LABEL
。
我如何实现它?
答案 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个索引将包含所需的数据