【问题标题】:PHP strpos differentiating between two similar wordsPHP strpos区分两个相似词
【发布时间】:2014-06-10 22:37:33
【问题描述】:

我正在尝试解析文件,但由于我正在尝试查找与文件中的另一个单词相似的单词的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”当然没有,但似乎没有任何效果。

【问题讨论】:

  • "\t" 是制表符,不是空格
  • 我知道,但我已经绝望到想尝试任何事情!

标签: php substr strpos


【解决方案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);

【讨论】:

  • 我可以使用 regex 去掉 BEGIN_DATA 561,head Scratcher 试图让代码区分两个相似的 BEGIN_DATA 块。
【解决方案2】:

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

【讨论】:

  • 感谢您的评论;数据文件的结构描述得很好,DATA_567 块出现在 DATA 块之前,这通常是文件中的最后一件事,但偶尔会执行诊断,这会在之后放置大量额外数据,所以看起来很诡计在文件的最后只有时会起作用。
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2013-03-20
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多