我试图解析一个文件,但是因为我试图找到一个类似于另一个单词的strpos
这一事实,我受到了阻碍。文件。
例如,我的文件有类似
BEGIN_DATA_567 329
...
END_DATA_567
BEGIN_DATA 561
....
END_DATA
(标记之后的329和561只是虚拟数据)
我试图匹配BEGIN_DATA
和END_DATA
,而不是BEGIN_DATA_567
和END_DATA_567
,但当然它会在第一次出现时进行匹配,这是错误。
我试图使用
$word1='BEGIN_DATA';
$word2='END_DATA';
然后使用
获取它们之间的数据$between=substr($contents, strpos($contents, $word1), strpos($contents, $word2) - strpos($contents, $word1));
当然这不起作用 - 它会在BEGIN_DATA_567
上接收。我尝试过像
$word1="BEGIN_DATA "; and $word1="BEGIN_DATA\t";
因为我想要获得的strpos
有一个空格,但当然" BEGIN_DATA_567
"并没有什么似乎有用。
答案 0 :(得分:1)
您可以使用preg_match。这是一个有效的解决方案:
preg_match('/BEGIN_DATA /', $contents, $matches, PREG_OFFSET_CAPTURE);
$start = $matches[0][1];
preg_match('/END_DATA$/', $contents, $matches, PREG_OFFSET_CAPTURE);
$end = $matches[0][1];
$between=substr($contents, $start, $end - $start);
答案 1 :(得分:0)
这将使用 preg_match()获取BEGIN_DATA和END_DATA之间的内容:
preg_match("/\bBEGIN_DATA\b(.+)\bEND_DATA\b/s", $str, $match);
echo $match[1];
使用 strpos(),您尝试使用$word1 = 'BEGIN_DATA ';
是一个很好的想法,但由于$word2
而失败。如果END_DATA
之后总是有空格,那么这将有效(您需要考虑$word1
的长度):
$word1 = 'BEGIN_DATA ';
$word2 = 'END_DATA ';
$between = substr(
$contents,
strpos($contents, $word1) + strlen($word1),
strpos($contents, $word2) - (strpos($contents, $word1) + strlen($word1))
);
还有一些其他选项可行,但您需要了解$contents
的“规则”。例如,END_DATA
总是在最后吗? %BEGIN_DATA%*
或%END_DATA%
出现在实际起点和终点之间的任何位置吗?如果有足够的预期输入知识,您可以使 strpos()方法有效 - 但我只需使用 preg_match()