15 votes

Comment trouver l'avant-dernière occurrence d'un caractère dans une chaîne de caractères ?

Si possible, n'utilisez que des fonctions PHP standard telles que substr(), strrpos(), strpos(), etc.

28voto

user83591 Points 3857

Il faut d'abord trouver la dernière position :

$last = strrpos($haystack, $needle);
if ($last === false) {
  return false;
}

De là, trouvez l'avant-dernier :

$next_to_last = strrpos($haystack, $needle, $last - strlen($haystack) - 1);

8voto

Matthew Flaschen Points 131723

Solution générale pour n'importe quel nombre de pas en arrière :

function strrpos_count($haystack, $needle, $count)
{
    if($count <= 0)
        return false;

    $len = strlen($haystack);
    $pos = $len;

    for($i = 0; $i < $count && $pos; $i++)
        $pos = strrpos($haystack, $needle, $pos - $len - 1);

    return $pos;
}

1voto

Gumbo Points 279147

Avec strpos :

$pos = -1; $last = null; $secondLast = null;
while (($pos = strpos($haystack, $needle, $pos+1)) !== false) {
    $secondLast = $last;
    $last = $pos;
}
if (!is_null($secondLast)) {
    echo 'second last occured on '.$secondLast;
}

0voto

ilya n. Points 6610

Recherche d'une expression rationnelle (corrigez-moi si je me trompe, et comment l'écrire en PHP) :

    r'x[^x]*x[^x]*$'.replace('x',your_char)

0voto

Martin Tilsted Points 489

Je ne pense pas que cela soit possible avec strrpos parce que le début de la position n'a pas été défini. pas de la façon dont on s'y attendrait.

Il n'y a pas, à première vue, de solution évidente, mais cette fonction devrait permettre d'y parvenir. (Elle n'a pas été testée, mais je pense qu'elle fonctionne).

    /** Return the position of the second last needle in haystack or false if nothing is found. I really hate functions with return types that depend on their input, but this function is made to look like the similary php functions (strpos, strrpos and so on) */

// Needle must be a char. If you want it to be a string instead, just substr
// length of needle instead of 1 in this example.
    function findSecondLastChar($needle,$haystack) {
      $found=0;
      for($pos=strlen($haystack)-1;$pos>=0;$pos--) {
        if(substr($haystack,$pos,1)==$needle) {
          if($found++ == 1)
            return $pos;
        }
      }
       // If we reach this, nothing were found
       return false;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X