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

Php 提取字符串匹配模式的一部分,php,regex,string,multidimensional-array,Php,Regex,String,Multidimensional Array,我想用PHP扫描一大块文本,找到一个模式的所有匹配项,然后在匹配项上方两行,下方两行 我的文本如下所示,但在本示例的上面和下面有一些额外的不必要的文本: 一, 描述文本 123.456.12 10点 10点 三, 不同描述文本 234.567.89 10点 30.00 #某些页脚文本是不需要的,并且将针对每个文本文件进行更改# 十五 更多描述文本 564.238.02 4.00 60.00 十五 更多描述文本 564.238.02 4.00 60.00 #某些页脚文本是不需要的,并且将针对每个文

我想用PHP扫描一大块文本,找到一个模式的所有匹配项,然后在匹配项上方两行,下方两行

我的文本如下所示,但在本示例的上面和下面有一些额外的不必要的文本:

一,

描述文本

123.456.12

10点

10点

三,

不同描述文本

234.567.89

10点

30.00

#某些页脚文本是不需要的,并且将针对每个文本文件进行更改#

十五

更多描述文本

564.238.02

4.00

60.00

十五

更多描述文本

564.238.02

4.00

60.00

#某些页脚文本是不需要的,并且将针对每个文本文件进行更改#

十五

更多描述文本

564.238.02

4.00

60.00

十五

更多描述文本

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);
编辑:好吧,那就用正则表达式吧

$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");
}
编辑:好吧,那就用正则表达式吧

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

您可以将文件加载到一个数组中,然后使用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);
?>

您可以将文件加载到一个数组中,然后使用array\u 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);
?>

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

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

(?P<name>regex)
(?Pregex)
命名捕获组的名称

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

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

(?P<name>regex)
(?Pregex)


命名捕获组的块。

是否总是5行的块?在我发布的示例上方和下方都会有其他文本,但在项目循环中,它总是5行的块。此外,粗体数字总是以相同的格式-3个数字,点,3个数字,点,2个数字我也刚刚意识到,虽然在项目循环中,它总是由5行组成,但文本文件可能跨越多个页面,因此有一个我需要忽略的页脚。这就是为什么我想知道你是否可以匹配粗体数字,然后将其收集,前两行和后两行作为其他文本将被忽略。它总是5行的块吗?在我发布的示例上下都会有其他文本,但在项目循环中,它总是5行的块。而且,粗体数字总是采用相同的格式-3个数字,点,3个数字,点,2个数字。我刚刚意识到,虽然在项目循环中,它总是5行的块,但文本文件可能跨越多个页面,因此有一个页脚,我需要忽略。这就是为什么我想知道你是否可以匹配粗体数字,然后收集,前两行和后两行作为其他文本将被忽略。对不起,编辑我的帖子说,文本文件中也会有其他文本,在我发布的示例的上方和下方。我不需要这个,所以需要忽略它。但是你的数据都在一块中,对吗?有分隔符吗?没有,对不起,我本来是想贴的。我将更新我的示例文本以向您展示可能发生的情况…谢谢,但刚刚尝试了您的代码,它将为我发布的示例返回“未找到匹配的模式”。*叹气*您的行是否由双换行符分隔?如果是这样,请检查更新。抱歉,编辑我的帖子是为了说文本文件中也会有其他文本,在我发布的示例的上方和下方。我不需要这个,所以需要忽略它。但是你的数据都在一块中,对吗?有分隔符吗?没有,对不起,我本来是想贴的。我将更新我的示例文本以向您展示可能发生的情况…谢谢,但刚刚尝试了您的代码,它将为我发布的示例返回“未找到匹配的模式”。*叹气*您的行是否由双换行符分隔?如果是这样,请检查更新。谢谢,但请查看我更新的示例和注释,文件中还有其他我不需要的文本,因此我只希望匹配粗体数字模式,然后获取前两行和后两行标记,但是请看我更新的示例和注释,文件中还有其他我不需要的文本,因此我只希望匹配粗体数字模式,然后获得前两行和后两行