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

时间:2011-10-19 10:03:13

标签: php regex string multidimensional-array

我想使用PHP扫描一大段文本并查找模式的所有匹配项,但是匹配项上方还有2行,下面是2行。

我的文字看起来像这样,但在此示例的上方和下方有一些额外的不必要的文字:

  

1

     

说明文字

     

123.456.12

     

10.00

     

10.00

     

3

     

不同的描述文字

     

234.567.89

     

10.00

     

30.00

     

#Some footer文本不需要,会针对每个文本文件进行更改#

     

15

     

更多说明文字

     

564.238.02

     

4.00

     

60.00

     

15

     

更多说明文字

     

564.238.02

     

4.00

     

60.00

     

#Some footer文本不需要,会针对每个文本文件进行更改#

     

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);

3 个答案:

答案 0 :(得分:2)

$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);

编辑:那么,正则表达式。

$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+)\n\n(\w.*)\n\n(\d{3}\.\d{3}\.\d{2})\n\n(\d.*)\n\n(\d.*)/', $file_contents, $matches)) {
    print_r($matches[0]);
    // do your matching to field names from here ..
}
else
{
    die("No matching patterns found");
}

答案 1 :(得分:1)

(.)+\n+(.)+\n+(\d{3}\.\d{3}\.\d{2})\n+(.)+\n+(.)+

可能需要将\ n替换为\ r \ n。确保正则表达式处于“。”模式时。与新行字符不匹配。

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

(?P<name>regex)

example指定的捕获组。

答案 2 :(得分:0)

你可以在一个数组中加载文件,并使用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);
?>