提取字符串匹配模式的一部分



我想用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";

等等。。。

这可能吗?我会使用regex吗?如有任何帮助或建议,我们将不胜感激!

感谢

vzwick回答

这是我使用的最后一个代码:

$items_array = array();
$counter = 0;
if (preg_match_all('/(d+)nn(w.*)nn(d{3}.d{3}.d{2})nn(d.*)nn(d.*)/', $text_file, $matches)) {
    $items_string = $matches[0];
    foreach ($items_string as $value){
        $item = explode("nn", $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);
$filename = "yourfile.txt";
$fp = @fopen($filename, "r");
if (!$fp) die('Could not open file ' . $filename);
$i = 0; // element counter
$n = 0; // inner element counter
$field_names = array('qty', 'description', 'some_number', 'price', 'total');
$result_arr = array();
while (($line = fgets($fp)) !== false) {
    $result_arr[$i][$field_names[$n]] = trim($line);
    $n++;
    if ($n % count($field_names) == 0) {
        $i++;
        $n = 0;
    }
}
fclose($fp);
print_r($result_arr);

编辑:好吧,然后是regex。

$filename = "yourfile.txt";
$file_contents = @file_get_contents($filename);
if (!$file_contents) die("Could not open file " . $filename . " or empty file");
if (preg_match_all('/(d+)nn(w.*)nn(d{3}.d{3}.d{2})nn(d.*)nn(d.*)/', $file_contents, $matches)) {
    print_r($matches[0]);
    // do your matching to field names from here ..
}
else
{
    die("No matching patterns found");
}
(.)+n+(.)+n+(d{3}.d{3}.d{2})n+(.)+n+(.)+

可能需要用\r\n替换。当"."与换行符不匹配时,请确保regex处于模式。

要按名称引用组,请使用命名的捕获组:

(?P<name>regex)

命名捕获组的示例。

您可以将文件加载到数组中,并使用array_slice对每5行进行切片。

<?php
$file = file("myfile");
$finalArray = array();
for($i = 0; $i < sizeof($file); $i = $i+5)
{
    $finalArray[] = array_slice($file, $i, 5); 
}
print_r($finalArray);
?>

相关内容

  • 没有找到相关文章

最新更新