我有从原理图软件生成的txt文件的文件格式:
(
NETR5_2
R6,1
R5,2
)
(
NETR1_2
R4,2
R3,1
R3,2
R2,1
R2,2
R1,1
R1,2
)
我需要得到这个:
Array
(
[0] => Array
(
[0] => NETR5_2
[1] => R6,1
[2] => R5,2
)
[1] => Array
[0] => NETR1_2
[1] => R4,2
[2] => R3,1
[3] => R3,2
[4] => R2,1
[5] => R2,2
[6] => R1,1
[7] => R1,2
)
这是我尝试的代码,但我从输入字符串中获取所有内容:
$file = file('tangoLista.txt');
/* GET - num of lines */
$f = fopen('tangoLista.txt', 'rb');
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192), "\n");
}
fclose($f);
for ($i=0;$i<=$lines;$i++) {
/* RESISTORS - check */
if (strpos($file[$i-1], '(') !== false && strpos($file[$i], 'NETR') !== false) {
/* GET - id */
for($k=0;$k<=10;$k++) {
if (strpos($file[$i+$k], ')') !== false || empty($file[$i+$k])) {
} else {
$json .= $k.' => '.$file[$i+$k];
}
}
$resistors_netlist[] = array($json);
}
}
echo '<pre>';
print_r($resistors_netlist);
echo '</pre>';
我需要在(和)之间读取并放入数组值...我尝试使用检查行是否开头(和NETR,如果是的话放入数组......但我不知道如何得到数字如果(和)之间的项目,以获取foreach循环以读取值并放入数组。
我犯错误的地方?代码可以缩短吗?
答案 0 :(得分:1)
尝试使用preg_match_all
:
$text = '(
NETR5_2
R6,1
R5,2
)
(
NETR1_2
R4,2
R3,1
R3,2
R2,1
R2,2
R1,1
R1,2
)';
$chunks = explode( ")(", preg_replace('/\)\W+\(/m',')(',$text) );
$result = array();
$pattern = '{([A-z0-9,]+)}';
foreach( $chunks as $row )
{
preg_match_all( $pattern, $row, $matches );
$result[] = $matches[1];
}
print_r( $result );
的 eval.in demo 强>
我不是正则表达的王者,所以你可以找到更好的方法。
主要问题是括号:我不知道在结束和下一个开括号()????(
)之间是什么,所以首先我替换每个空格,tab,cr或ln之间,然后我通过{爆炸字符串{1}}。
我为结果数组的每个元素执行)(
循环,匹配每次出现的foreach
并将检索到的值数组添加到一个空数组中,该数组在A-z0-9,
结束时将包含所需的结果。
主模式基于提供的示例:如果值包含其他字符,则foreach
正则表达式失败。
用A-z 0-9 ,
答案 1 :(得分:1)
尝试这种方法:
<?php
$f = fopen('test.txt', 'rb');
$resistors_netlist = array();
$current_index = 0;
while (!feof($f)) {
$line = trim(fgets($f));
if (empty($line)) {
continue;
}
if (strpos($line, '(') !== false) {
$resistors_netlist[$current_index] = array();
continue;
}
if (strpos($line, ')') !== false) {
$current_index++;
continue;
}
array_push($resistors_netlist[$current_index], $line);
}
fclose($f);
print_r($resistors_netlist);
这给了我:
Array
(
[0] => Array
(
[0] => NETR5_2
[1] => R6,1
[2] => R5,2
)
[1] => Array
(
[0] => NETR1_2
[1] => R4,2
[2] => R3,1
[3] => R3,2
[4] => R2,1
[5] => R2,2
[6] => R1,1
[7] => R1,2
)
)
我们从$current_index
开始0
。当我们看到(
时,我们会在$resistors_netlist[$current_index]
创建一个新的子数组。当我们看到)
时,我们会将$current_index
增加1.对于任何其他行,我们只需将其附加到$resistors_netlist[$current_index]
的末尾。