【问题标题】:strpos() returning seemingly random valuesstrpos() 返回看似随机的值
【发布时间】:2012-10-31 06:02:44
【问题描述】:

我正在尝试提取字符串的位。

字符串如下所示:

$rowstr = "8:12-bk-16430|8:2012-bk-16430|1080751|7|||||10/30/2012|1/30/2012|||bk|||PINELLAS-FL|Tampa|Paid...

我得到第一个字段就好了:

$pos1 = strpos($rowstr, "|") +1; //begining of field case number
$pos2 = strpos($rowstr, "|", $pos1 + 1); //end of field case number
$len1 = $pos2 - $pos1;  //string length
$field['case_num'][$i] = substr($rowstr,$pos1,$len1); // casenumber extracted

但是当我尝试提取第二个字段时(应该是1080751

$pos3 = strpos($rowstr, "|", $pos2); //end of field 
$pos4 = strpos($rowstr, "|", $pos3 + 1); //end of field
$len2 = $pos3 - $pos4;  //string length
$field['field2'][$i] = substr($rowstr,$pos3,$len2); // field 2 extracted

结果是一个很长的以|1080751|7|||||10/30/2012|10..开头的字符串。

如果$pos3 返回16$pos4 返回24,那么为什么我得到的结果比8 个字符长? PHP 是否出于某种原因不计算特殊包机?我该如何解决这个问题?

【问题讨论】:

  • 你为什么不用explode()
  • +1 表示易于重现的测试用例和明确的问题
  • 为什么$pos3 会返回24?第 24 个字符是一个连字符,与我要查找的内容相去甚远。 PHP 会跳过某些字符吗?
  • @Touki 我想我会试一试,这太混乱了

标签: php substr strpos


【解决方案1】:

试试

// Added + 1 here
$pos3 = strpos($rowstr, "|", $pos2) + 1; //end of field
$pos4 = strpos($rowstr, "|", $pos3 + 1); //end of field
// swapped $pos3 and $pos4 here
$len2 = $pos4 - $pos3;  //string length
$field['field2'][$i] = substr($rowstr,$pos3,$len2); // field 2 extracted

【讨论】:

  • 肯定更好,但现在我返回 |7 而不是实际的第二个字段。但这是可行的。谢谢。
  • $pos3 是,在其他人中,不是。我有你在回答中的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 2014-12-10
  • 1970-01-01
  • 2019-09-26
相关资源
最近更新 更多