2009-06-15 4 views

ответ

24

Во-первых, найти последнюю позицию:

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

От там, найти второй последний :

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

Следует отметить, что это не будет работать должным образом в PHP 4. –

+0

Ба, не проверить это полностью. Это должно сделать это. –

8

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

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

С 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

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

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

Снова прочитайте вопрос; Я не думаю, что OP разрешено использовать регулярные выражения. –

+0

Это именно то, что я был после, однако, так tyvm! Я не буду повышать, так как он точно не отвечает на вопрос OP, но я рад, что вы отправили свой ответ. :) – jbaums

0

Я не думаю, что это может быть сделано с 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

Мартин, я согласен strrpos очень неинтуитивно, но я, наконец, получил его на работу. См. Мой обновленный ответ. –

Смежные вопросы