2009-06-15 23 views

Respuesta

24

primer lugar, encontrar la última posición:

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

A partir de ahí, encontrar la segunda pasada :

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

Debe tenerse en cuenta que esto no funcionará correctamente en PHP 4. –

+0

Bah, no probar esta totalmente. Deberias hacer eso. –

8

solución general para cualquier número de pasos hacia atrás:

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
Con

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

buscar una expresión regular (PLZ me corrija si estoy equivocado, y la forma de escribirlo en PHP):

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

Lee la pregunta nuevamente; No creo que el OP tenga permitido usar expresiones regulares. –

+0

Esto es exactamente lo que estaba buscando, ¡así que tío! No voy a votar porque no responde exactamente la pregunta del OP, pero me alegra que hayas publicado tu respuesta. :) – jbaums

0

no creo que esto se puede hacer con strrpos porque el inicio de posición no funciona en la forma esperada.

No hay una manera obvia, pero esta función debería hacerlo. (No realmente probado, pero creo que funciona).

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

Martin, estoy de acuerdo que strrpos es muy poco intuitivo, pero finalmente lo hice funcionar. Ver mi respuesta actualizada. –

Cuestiones relacionadas