PHP strpos区分两个相似的单词

时间:2014-06-10 22:37:33

标签: php substr strpos

我试图解析一个文件,但是因为我试图找到一个类似于另一个单词的strpos这一事实,我受到了阻碍。文件。 例如,我的文件有类似

的内容
BEGIN_DATA_567 329
...
END_DATA_567

BEGIN_DATA 561
....
END_DATA

(标记之后的329和561只是虚拟数据)

我试图匹配BEGIN_DATAEND_DATA,而不是BEGIN_DATA_567END_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"并没有什么似乎有用。

2 个答案:

答案 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];

See demo

使用 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()