【发布时间】:2011-12-10 19:12:43
【问题描述】:
我想使用 PHP 扫描一大段文本并找到一个模式的所有匹配项,然后还要找到匹配项上方的 2 行和下方的 2 行。
我的文字看起来像这样,但在这个示例的上方和下方有一些额外的不必要的文字:
1
说明文字
123.456.12
10.00
10.00
3
不同的描述文本
234.567.89
10.00
30.00
#一些不需要的页脚文本,每个文本文件都会改变#
15
更多描述文字
564.238.02
4.00
60.00
15
更多描述文字
564.238.02
4.00
60.00
#一些不需要的页脚文本,每个文本文件都会改变#
15
更多描述文字
564.238.02
4.00
60.00
15
更多描述文字
564.238.02
4.00
60.00
使用 PHP,我希望以粗体匹配每个数字(总是相同的格式 - 3 个数字、点、3 个数字、点、2 个数字),然后还返回前 2 行和接下来 2 行,并希望返回一个数组以便我可以使用:
$contents[$i]["qty"] = "1";
$contents[$i]["description"] = "Description text";
$contents[$i]["price"] = "10.00";
$contents[$i]["total"] = "10.00";
等等……
这可能吗?我会使用正则表达式吗?任何帮助或建议将不胜感激!
谢谢
vzwick 回答
这是我使用的最终代码:
$items_array = array();
$counter = 0;
if (preg_match_all('/(\d+)\n\n(\w.*)\n\n(\d{3}\.\d{3}\.\d{2})\n\n(\d.*)\n\n(\d.*)/', $text_file, $matches)) {
$items_string = $matches[0];
foreach ($items_string as $value){
$item = explode("\n\n", $value);
$items_array[$counter]["qty"] = $item[0];
$items_array[$counter]["description"] = $item[1];
$items_array[$counter]["number"] = $item[2];
$items_array[$counter]["price"] = $item[3];
$items_array[$counter]["total"] = $item[4];
$counter++;
}
}
else
{
die("No matching patterns found");
}
print_r($items_array);
【问题讨论】:
-
总是5行的块吗?
-
在我发布的示例上方和下方会有其他文本,但在项目循环中,它将始终是 5 行的块。
-
此外,粗体数字将始终采用相同的格式 - 3 个数字、点、3 个数字、点、2 个数字
-
我也刚刚意识到,虽然在项目循环中它始终是 5 行的块,但文本文件可以跨越多个页面,因此有一个我需要忽略的页脚。这就是为什么我想知道您是否可以匹配粗体数字然后收集它,然后将忽略前两行和后两行作为其他文本。
标签: php regex string multidimensional-array