我使用简单的PHP代码来解析文件。有2个IF语句。
当我在第一个If语句中为数组x执行print_r时,我可以清楚地看到数组的所有值都不确定为什么它不会打印在我的表中,这是在第二个if语句中找到匹配时创建的。
任何人都有任何投入。看来我应该做嵌套,但这对我不起作用。 $ file中的数据是
测试1的abc test1:xxx test1> TEST3> x / y / z:x1 / y2 / z3 abc test2 for test2:xxx test2> TEST3>测试3的x / y / z:x1 / y2 / z3 abc test3: xxx test3> x / y / z:x1 / y2 / z3
我也在上传图片数据的格式是如何存档的。 fileformatofabovedata
while(!feof($file)) {
$str = fgets($file); $array = (explode(":",$str)); if(preg_match("/x1|y2|z3/",$array[1])){
$versions = (explode("/",$array[1]));
}
if(preg_match("/abc|:xxx|:yyy/", $array[0])) {
$count++;
echo "<tr><td>Test case $count</td><td>$array[0]</td><td>$versions[0]</td><td>$versions[1]</td><td>$versions[2]</td><td>$array[1]</td></tr>";
}
}
在$ version中,我得到3个值,我想打印它们,即使第二个IF语句找到匹配的模式。由于第二个IF语句也在第一个IF语句中具有匹配的模式数组值被丢弃。循环继续读取文件。我已经以jpg格式上传了当前输出。 my current output 表应该正确填充第1行中的数据。但它会在第二行打印出来。基本上所有3行都应填充正确的数据。
答案 0 :(得分:0)
我建议您将输入文件的全部内容整合到一个字符串中(使用file_get_contents
),而不是逐行工作,因为您的目标数据是成对出现的。
我提供的模式使用一些非常普遍的否定字符类和技术来隔离样本数据中的子字符串。如果此模式不适用于您的实际项目,则需要提供更实际的输入数据集。
Pattern Demo&lt; - 这提供了模式细分
代码:(Demo)
$contents = file_get_contents($file);
if (!preg_match_all('~^([^:>]+):\s(\S+)[^:]+:\s(\S+)\s/\s(\S+)\s/\s(\S+)\s*$~m', $contents, $matches, PREG_SET_ORDER)) {
echo "Pattern Failed";
} else {
echo "<table>";
foreach ($matches as $i => $data) {
echo "<tr>";
echo "<td>Test case " , ++$i , "</td>";
echo "<td>{$data[1]}</td>";
echo "<td>{$data[3]}</td>";
echo "<td>{$data[4]}</td>";
echo "<td>{$data[5]}</td>";
echo "<td>{$data[2]}</td>";
echo "</tr>";
}
echo "</table>";
}
输出:
<table>
<tr>
<td>Test case 1</td>
<td>abc test1 for test1</td>
<td>x1</td>
<td>y2</td>
<td>z3</td>
<td>xxx</td>
</tr>
<tr>
<td>Test case 2</td>
<td>abc test2 for test2</td>
<td>x1</td>
<td>y2</td>
<td>z3</td>
<td>xxx</td>
</tr>
<tr>
<td>Test case 3</td>
<td>abc test3 for test3</td>
<td>x1</td>
<td>y2</td>
<td>z3</td>
<td>xxx</td>
</tr>
</table>