Php 从输入文件中筛选有用的数据

Php 从输入文件中筛选有用的数据,php,Php,我有一个相当大而且非常混乱的数据文件,我希望从中过滤有用的数据。其结构如下所示: !bla bla more bla some useless data something interesting something interesting something interesting some useless data something interesting something interesting some useless data bla bla 我的计划是使用file\u g

我有一个相当大而且非常混乱的数据文件,我希望从中过滤有用的数据。其结构如下所示:

!bla bla
more bla
some useless data
something interesting
 something interesting
 something interesting
some useless data
something interesting
 something interesting
some useless data
bla bla
我的计划是使用
file\u get\u contents()
读取文件,然后使用
str\u replace()
替换一些数据并将其用作标记。接下来,我尝试将无用的数据从文件的开头删除到
marker1
,然后从
marker2
删除到
marker3
,然后从
marker4
删除到文件的结尾,这样我只会在输出中获得有用的数据(此时我还不确定是否需要数据中的标记)。我尝试使用
strstr()
,但无法正常工作

    !bla bla
    more bla
    some useless data
    ==marker1==
    something interesting
     something interesting
     something interesting
    ==marker2==
    some useless data
    ==marker3==
    something interesting
     something interesting
    ==marker4==
    some useless data
    bla bla
我将使用
explode()
将生成的有用数据传输到我的数据库

编辑: 我就这样解决了这个问题

preg_match('/(==marker1==)(.*?)(==marker2==)/s', $input, $marker1to2);
$marker1to2 = trim($marker1to2[2]); 
$marker1to2 = preg_replace('/something /', '==marker1== something ', $marker1to2, 1); 
echo $marker1to2;

您需要正则表达式:

$data = "!bla bla
more bla
some useless data
==marker1==
something interesting
 something interesting
 something interesting
==marker2==
some useless data
==marker3==
something interesting
 something interesting
==marker4==
some useless data
bla bla";

preg_match("/(==marker1==)(.*)(==marker2==)/s", $data, $marker1to2);
$marker1to2 = trim($marker1to2[2]);

preg_match("/(==marker3==)(.*)(==marker4==)/s", $data, $marker3to4);
$marker3to4 = trim($marker3to4[2]);

echo "Marker 1 to 2:\n$marker1to2\n\n";
echo "Marker 3 to 4:\n$marker3to4\n\n";
输出:

Marker 1 to 2: something interesting something interesting something interesting Marker 3 to 4: something interesting something interesting 标记1至2: 有趣的事 有趣的事 有趣的事 标记3至4: 有趣的事 有趣的事
它适用于您的示例,但当我尝试将相同的原则应用于我的数据时,什么都没有发生。还有其他简单的方法吗?也许是strstr()的问题?我试着查找类似strstr的东西($data,$from_marker1,$to_marker2),但没有这样的运气你能发布一些真实的数据吗?我将用真实数据再次测试我的正则表达式。数据来自防火墙配置文件,我无法将其联机。您的标记真的被称为
==marker1=
?请在
$marker1to2=…
之前添加
var_dump($marker1to2)
,以查看是否有一些输出。这是var_dump()返回的结果:似乎正确,但我认为:|,但输出仍然带有我要删除的文本。数组(size=4)0=>string'标记内容1标记之间的文本2'(长度=105)1=>string'标记内容1'(长度=23)2=>string'标记之间的文本'(长度=35)3=>string'标记内容2'(长度=47)