I understand that this function will get the first occurrence of the string.
But what I want is the 2nd occurrence.
How to go about doing that?
Old question but how about using 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));
The recursive function from Smokey_Bud was slowing my script drastically down. Using a regular expression is much faster in this case (for finding any occurence):
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);
Please check the following code ... it works pretty fine for me.
<?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');
?>
Simple is beautiful
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;
}
just worked for me to find if are 2 or more occurrence of a char, then by strlen them i found that exist 2 occurrence ex ( i dont use $matches at all):
$string = '1234|6|#red';
if(strlen(preg_match_all('/|/', $string,$matches, PREG_OFFSET_CAPTURE)) ==2){
echo 'i have 2 occurence of char: |';
}
Old question, but if someone's looking for a way to find occurrences from the END of the string (for example 3rd occurrence of dot from the end) the following function works (didn't want to use oncodes function not to mess with encoding)
$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
It's super simple. Basically each time it finds an occurrence of your needle it "trims" the string to that position. So it keeps on trimming it while returning the latest position each time.