Я понимаю, что эта функция получит первое вхождение строки.
Но то, что я хочу, – это второе явление.
Как это сделать?
Вам нужно указать смещение для начала поиска в качестве дополнительного третьего параметра и рассчитать его, начав поиск сразу после первого появления, добавив длину того, что вы ищете, к местоположению, в котором вы его нашли.
$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'); ?>
$newstring = 'abcdef abcdef'; $pos = strpos($newstring, 'a', 1); // $pos = 7, not 0