Entiendo que esta función tendrá la primera aparición de la cadena.

Pero lo que yo quiero es la 2ª aparición.

Cómo hacerlo?

InformationsquelleAutor vfvg | 2010-06-27

13 Comentarios

  1. 48

    Necesita especificar el desplazamiento para el inicio de la búsqueda, ya que el tercer parámetro opcional y calcularlo a partir de la búsqueda directamente después de la primera aparición mediante la adición de la longitud de lo que estás buscando en el lugar que usted encontró en el.

    $pos1 = strpos($haystack, $needle);
    $pos2 = strpos($haystack, $needle, $pos1 + strlen($needle));
    • yo iba a usar preg_match_all. esto es mucho más sencillo.
    • Si la longitud de cadena de la que usted necesita saber es sólo un personaje. A continuación, sólo tendrá que añadir +1 en él». Por ejemplo,` strpos($pajar, $aguja, $pos1 + 1);
    • La adición de strlen($needle) o 1 al final hace una diferencia para las cadenas de búsqueda (agujas) como aa en cadenas de asunto (pajares) como aaaaa. Es la segunda aparición aa[aa]a o a[aa]aa? Esa es, probablemente, hasta el caso de uso específico.
  2. 47

    Sé que esta pregunta es una especie de viejo, pero aquí es una función que escribí para obtener el Número de aparición de una subcadena, que puede ser de ayuda para otras personas que tienen este problema y tropezar con este hilo.

    /**
     * Find the position of the Xth occurrence of a substring in a string
     * @param $haystack
     * @param $needle
     * @param $number integer > 0
     * @return int
     */
    function strposX($haystack, $needle, $number){
        if($number == '1'){
            return strpos($haystack, $needle);
        }elseif($number > '1'){
            return strpos($haystack, $needle, strposX($haystack, $needle, $number - 1) + strlen($needle));
        }else{
            return error_log('Error: Value for parameter $number is out of range');
        }
    }
    • Gracias por esto, guardar un poco de mi tiempo 😀 !
    • Este es por lejos la mejor solución a este problema que he visto. Bueno!
    • Esta debe ser la mejor respuesta! Gracias
    • ¿qué parámetros tiene ?, $valueReturn, «tag» , nºtag ¡?¿?¿=
  3. 10

    La función recursiva de Smokey_Bud fue el retraso de mi script drásticamente hacia abajo. Usando una expresión regular es mucho más rápido en este caso (para encontrar cualquier ocurrencia):

    function strposX($haystack, $needle, $number)
    {
        //decode utf8 because of this behaviour: https://bugs.php.net/bug.php?id=37391
        preg_match_all("/$needle/", utf8_decode($haystack), $matches, PREG_OFFSET_CAPTURE);
        return $matches[0][$number-1][1];
    }
    
    //get position of second 'wide'
    $pos = strposX('Hello wide wide world', 'wide', 2);
    • Hay una { demasiado en esto. Además de que las costuras para trabajar. Pero no puedo contar sobre la velocidad.
    • gracias por la buena captura, he actualizado el código.
  4. 9

    Para encontrar la segunda aparición de la cadena puede utilizar el strpos junto con el «offset» de los parámetros, mediante la adición previa de desplazamiento para strpos.

    $source = "Hello world, how you doing world...world ?";
    $find = "world";
    $offset = 0;
    $findLength = strlen($find);
    $occurrence = 0;
    
    while (($offset = strpos($source, $find, $offset))!== false) {
        if ($occurrence ++) {
          break;
        }
        $offset += $findLength; 
    }
    
    echo $offset;

    Usted puede encontrar todas las apariciones por el almacenamiento de desplazamiento en una matriz

    while (($offset = strpos($source, $find, $offset))!== false) {
      $occurrences[] = $offset;
      $offset += $findLength; 
    }
    var_export($occurrences);

    O puede obtener un acontecimiento específico por la coincidencia de $aparición

    //find 3rd occurrence
    if ($occurrence ++ == 2) {
        break;
    }
    • Me gusta este enfoque, es más elegante.
    • Esto hace algo más (pero relacionadas), aunque, y no es realmente lo que la pregunta parecía ser de unos o de lo que se supone strposSecond o strposX iba a hacer.
    • Gracias, he actualizado la respuesta.
  5. 8

    Que usted puede probar esto, aunque yo no lo he probado fuera

    $pos = strpos($haystack, $needle, strpos($haystack, $needle)+strlen($needle));
    • Esta es la mejor solución 😊
  6. 3

    Simple es bello

    function strposX($haystack, $needle, $n = 0)
    {
        $offset = 0;
    
        for ($i = 0; $i < $n; $i++) {
            $pos = strpos($haystack, $needle, $offset);
    
            if ($pos !== false) {
                $offset = $pos + strlen($needle);
            } else {
                return false;
            }
        }
    
        return $offset;
    }
    
    $offset = strposX($result, "\n", $n);
    
    if ($offset === false) {
        $offset = strlen($result) - 1;
    }
  7. 0

    sólo funcionó para mí, para saber si son 2 o más de ocurrencia de un char, entonces por strlen ellos, me encontré con que existen 2 ocurrencia ex ( yo no uso $los partidos en todos):

    $string = '1234|6|#red';
    
    if(strlen(preg_match_all('/|/', $string,$matches, PREG_OFFSET_CAPTURE)) ==2){
    
    echo 'i have 2 occurence of char: |';
    
        }
  8. 0

    Vieja pregunta, pero si alguien está buscando una manera de encontrar las apariciones desde el FINAL de la cadena (por ejemplo 3 de ocurrencia de puntos de la final) la siguiente función obras (no quería usar oncodes función de no meterse con la codificación)

    $str = "NooooYesYesNo";
    
    function find_occurence_from_end($haystack, $needle, $num) {
    
        for ($i=1; $i <=$num ; $i++) {
    
            # first loop return position of needle
            if($i == 1) {
                $pos = strrpos($haystack, $needle);
            }
    
            # subsequent loops trim haystack to pos and return needle's new position
            if($i != 1) {
    
                $haystack = substr($haystack, 0, $pos);
                $pos = strrpos($haystack, $needle);
    
            }
    
        }
    
        return $pos;
    
    }
    
    $pos = find_occurence_from_end($str, "Yes", 2);
    
    //5

    Es super simple. Básicamente, cada vez que se encuentra una aparición de la aguja se «recorta» la cadena a esa posición. Por lo que se mantiene en el recorte que mientras que vuelve a la última posición de cada tiempo.

  9. 0
    function substr_Index( $str, $nth ){
        $str2 = '';
        $posTotal = 0;
        for($i=0; $i < $nth; $i++){
    
            if($str2 != ''){
                $str = $str2;
            }
    
            $pos   = strpos($str, ':');
            $str2  = substr($str, $pos+1);
            $posTotal += $pos+1;
    
        }
        return $posTotal-1;
    }
    
    
    echo substr($mystring, substr_Index( $mystring , 2) );

    Función devuelve la posición de la enésima delimitador.

    Segundo parámetro de substr_Index debe ser mayor que 0;

    Para encontrar la segunda occourance uso substr_Index( $mystring , 2)

  10. 0

    Vieja pregunta pero, ¿cómo sobre el uso de explode?

    $corpus = "how many words are there in a dictionary? I'm not going to count them word by word...";
    $looking_for = 'word';
    $instance = 2;
    
    $parts = explode($looking_for, $corpus, $instance + 1);
    array_pop($parts);
    $position = strlen(implode($looking_for, $parts));
  11. 0

    Fácilmente, sólo tienes que hacer:

    $i = $pos = 0;    
    do {
            $pos = strpos( $string, $needle, $pos+1 );
    } while( $i++ < $nth);

    $n su situación es igual a 2.

  12. -1

    Por favor revise el siguiente código … funciona bastante bien para mí.

    <?php
        function f_srch ($s1, $par) {
            echo 'Searching for [' . $par . '] in [' . $s1 . ']<br>';
            $k = 0; //while loop
            $i = 0; //counter
    
            while ($k >= 0) {
                $pos = strpos($s1, $par, $k);
                if ($pos === false) {
                    $k=-1;
                    echo 'Letter not found'.'<br>';
                } else {
                    if ($pos == $k) { 
                        echo 'The position of the letter is '.$pos.'<br>'; 
                        $i++;
                    }
                    $k++;
                } 
            }
            echo 'The letter was found ' . $i . ' time(s).'.'<br>'; 
        }
        f_srch('i am searching for a letter in this sentence','t');
    ?>
  13. -15

    http://php.net/strpos

    $newstring = 'abcdef abcdef';
    $pos = strpos($newstring, 'a', 1);  //$pos = 7, not 0
    • Eso no es cierto, porque se empieza a buscar en el segundo personaje, así que si te había pasado en la cadena de ' abcdef abcdef' con un espacio al principio, se volverían 1 en lugar de 8, que creo que @vfvg estaba buscando.
    • Creo que necesitamos más pulgares abajo aquí

Dejar respuesta

Please enter your comment!
Please enter your name here