在PHP中,从末尾开始跳过匹配项进行字符串搜索


String search from the end with skipping matches in PHP

我想找到一个子字符串的位置,从结束的字符串,但有跳过参数。因此,如果我传递3,它应该跳过前3个匹配并返回第4个匹配的位置(如果没有找到匹配,则返回false)。

例如:

$str = '<h1>First</h1><h1>Second</h1><h1>Third</h1><h1>Fourth</h1>';
echo custom_search($str, '<h1>', 2);

应该返回14。

搜索将从字符串的末尾开始,并将跳过找到的<h1>的前两个匹配项,并返回下一个匹配<h1>的位置(该位置相对于字符串的开头)。

正如@RomanHocke在他的评论中所说,你必须在循环中使用strrpos,在每次迭代中更新offset参数。

类似这样的内容(它可以工作,尽管它肯定可以改进):

$str = '<h1>First</h1><h1>Second</h1><h1>Third</h1><h1>Fourth</h1>';
var_dump(custom_search($str, '<h1>', 0)); // int(43)
var_dump(custom_search($str, '<h1>', 1)); // int(29)
var_dump(custom_search($str, '<h1>', 2)); // int(14)
var_dump(custom_search($str, '<h1>', 3)); // int(0)
var_dump(custom_search($str, '<h1>', 4)); // bool(false)
var_dump(custom_search($str, 'I am not in the string', 0)); // bool(false)
function custom_search ($str, $substr, $n = 0) {
    $offset = 0;
    $total_offset = 0;
    for ($i=0; $i<=$n; $i++) {
        $strrpos = strrpos($str, $substr, $offset);
        $str= substr($str, 0, $strrpos);
    }
    return $strrpos;
}