Как найти второе-последнее вхождение символа в строке? - PullRequest
13 голосов
/ 16 июня 2009

Если возможно, используя только стандартные функции PHP, такие как substr (), strrpos (), strpos () и т. Д.

Ответы [ 5 ]

26 голосов
/ 16 июня 2009

Сначала найдите последнюю позицию:

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

Оттуда найдите 2-го последнего:

$next_to_last = strrpos($haystack, $needle, $last - strlen($haystack) - 1);
8 голосов
/ 16 июня 2009

Общее решение для любого количества обратных шагов:

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;
}
1 голос
/ 16 июня 2009

С 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;
}
0 голосов
/ 16 июня 2009

Я не думаю, что это можно сделать с помощью strrpos, потому что начало позиции не работать так, как вы ожидаете.

Существует не совсем очевидный способ, но эта функция должна это делать. (Не очень проверено, но я думаю, что это работает).

    /** 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;
    }

0 голосов
/ 16 июня 2009

Поиск регулярного выражения (пожалуйста, поправьте меня, если я ошибаюсь, и как написать его на PHP):

    r'x[^x]*x[^x]*$'.replace('x',your_char)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...