Вопрос о strpos. Как получить второе вхождение строки?

Я понимаю, что эта функция получит первое вхождение строки.

Но то, что я хочу, – это второе явление.

Как это сделать?

    Вам нужно указать смещение для начала поиска в качестве дополнительного третьего параметра и рассчитать его, начав поиск сразу после первого появления, добавив длину того, что вы ищете, к местоположению, в котором вы его нашли.

    $pos1 = strpos($haystack, $needle); $pos2 = strpos($haystack, $needle, $pos1 + strlen($needle)); 

    Я знаю, что этот вопрос довольно старый, но вот функция, которую я написал, чтобы получить X-е вхождение подстроки, что может быть полезно для других людей, у которых есть эта проблема, и наткнуться на этот поток.

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

    Рекурсивная функция от Smokey_Bud резко уменьшала мой сценарий. Использование регулярного выражения в этом случае намного быстрее (для нахождения любого случая):

     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); 

    Вы можете попробовать это, хотя я не тестировал его,

     $pos = strpos($haystack, $needle, strpos($haystack, $needle)+strlen($needle)); 

    альтернативный способ должен взорвать строку желаемым символом, а затем получить ее из массива по желаемому индексу

    например, у меня есть строка вроде

     $str = "hello-world-how-are-you-doing"; 

    И мне нужно получить текст после 4-го появления «-», т.е. я хочу «вы»,

    Мне нужно взорвать его, чтобы сделать его массивом

     $array = explode("-", $str); echo $array[4]; 

    Просто красиво

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

    просто работал для меня, чтобы найти, если есть 2 или более появление char, а затем strlen их я обнаружил, что существуют 2 вхождения ex (я вообще не использую $ match):

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

    Старый вопрос, но если кто-то ищет способ найти вхождения из END строки (например, 3-е вхождение точки с конца), работает следующая функция (не хотела использовать функцию oncodes, чтобы не испортить кодировку)

     $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 

    Это супер просто. В основном каждый раз, когда он обнаруживает появление вашей иглы, он «обрезает» строку в эту позицию. Таким образом, он продолжает обрезать его, возвращая последнюю позицию каждый раз.

    Пожалуйста, проверьте следующий код … он работает очень хорошо для меня.

     <?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'); ?> 

    http://php.net/strpos

     $newstring = 'abcdef abcdef'; $pos = strpos($newstring, 'a', 1); // $pos = 7, not 0