无法在字符串中找到第一个匹配项的位置

时间:2012-09-13 19:16:38

标签: php strpos

我需要在不重复的字符串中找到第一个字符出现的位置。到目前为止,我所有$pos输出0

<?php
$sentence = "some long string";
$found = false;

while(!$found && $sentence!== ""){
  $c = $sentence[0];
  $count = substr_count($sentence,$c);

  if ($count == 1) $found = true;
  else $sentence = str_replace($c,"",$sentence);
}
$pos = strpos($sentence, $c);
echo "$c: $pos";

输出l:0。怎么了?

我知道$pos = strpos($sentence, $c);不是找到位置的正确方法。为什么我很困惑,当我回显$ c时,它的值是“l”。所以,我想如果我在strpos中使用它的值,它会给我正确的位置。因此,为了获得有关如何提取第一个非重复字符位置的帮助,我想我会在StackOverlow请求指向正确的方向。不需要d ** ks,我只是学习,我很感激帮助。

4 个答案:

答案 0 :(得分:2)

您的代码几乎是正确的。当我测试它时,我得到'm:0',这确实是第一个只出现一次的角色。位置为0的原因是,每次尝试新角色时,您都在缩小原始字符串。

我建议您在开始查找字符串之前复制字符串,然后使用副本计算最后的位置,而不是缩小的字符串。

<?php
$sentence = "some long string";
$sentence_copy = $sentence;
$found = false;

while(!$found && $sentence!== ""){
  $c = $sentence[0];
  $count = substr_count($sentence,$c);
  if ($count == 1) $found = true;
  else $sentence = str_replace($c,"",$sentence);
}

$pos = strpos($sentence_copy, $c);
echo "$c: $pos";

这给了我'm:2',这是正确的。

答案 1 :(得分:1)

关于评论

  

我需要找到第一个不重复的角色的位置。

<?php
$numberOfOccurences = array_count_values(str_split($string, 1));
$uniqueCharacters = array_keys(
    array_filter($numberOfOccurences, function($c) { return $c == 1; })
);
echo $uniqueCharacters[0] . ':' . strpos($string, $uniqueCharacters[0]);

这个想法很简单,我们将字符串视为字符串,但作为一组字符,计算每个字符,然后只保留一次出现的字符($c == 1 array_filter() )和(假设,函数是稳定的[1])取第一个。

[1]“稳定”意味着他们保持秩序。如果不是,那么你必须在$uniqueCharacters以上找到它,然后找到第一个手动显示的那个。

$positions = array_map(
    $uniqueCharacters,
    functions ($character) use ($string) { return strpos($string, $character); }
);
$pos = min($positions);
echo "{$string[$pos]}:$pos";

答案 2 :(得分:0)

http://php.net/manual/en/function.strpos.php

  

返回针存在于相对于haystack字符串开头的位置(与offset无关)。另请注意,字符串位置从0开始,而不是1。

     

如果未找到针,则返回FALSE。

其次,$c = $sentence[0]strpos($sentence, $c)不会让您获得有关您已经知道的更多信息。

答案 3 :(得分:0)

要在字符串中查找子字符串的位置,您应该使用strpos方法:

http://www.php.net/manual/en/function.strpos.php