strrpos

Find the position of the last occurrence of a substring in a string

&reftitle.description; ``int``false```strrpos` `string` `haystack` `string` `needle` `int` `offset` 0

Find the numeric position of the last occurrence of `needle` in the `haystack` string.

&reftitle.parameters;

`haystack`

- The string to search in.

`needle`

- The string to search for.

  &strings.parameter.needle.non-string;

`offset`

- If zero or positive, the search is performed left to right skipping the first `offset` bytes of the `haystack`.

  If negative, the search starts `offset` bytes from the right instead of from the beginning of `haystack`. The search is performed right to left, searching for the first occurrence of `needle` from the selected byte.

  This is effectively looking for the last occurrence of `needle` at or before the last `offset` bytes.

&reftitle.returnvalues;

Returns the position where the needle exists relative to the beginning of the `haystack` string (independent of search direction or offset).

String positions start at 0, and not 1.

Returns &false; if the needle was not found.

&return.falseproblem;
&reftitle.changelog;

&Version; | &Description;
&strings.changelog.needle-empty;
8.0.0 | Passing an &integer; as `needle` is no longer supported.
7.3.0 | Passing an &integer; as `needle` has been deprecated.

&reftitle.examples;

### Checking if a needle is in the haystack

It is easy to mistake the return values for "character found at position 0" and "character not found". Here's how to detect the difference:

    <?php

    $pos = strrpos($mystring, "b");
    if ($pos === false) { // note: three equal signs
        // not found...
    }

    ?>

### Searching with offsets

    <?php
    $foo = "0123456789a123456789b123456789c";

    // Looking for '0' from the 0th byte (from the beginning)
    var_dump(strrpos($foo, '0', 0));

    // Looking for '0' from the 1st byte (after byte "0")
    var_dump(strrpos($foo, '0', 1));

    // Looking for '7' from the 21th byte (after byte 20)
    var_dump(strrpos($foo, '7', 20));

    // Looking for '7' from the 29th byte (after byte 28)
    var_dump(strrpos($foo, '7', 28));

    // Looking for '7' right to left from the 5th byte from the end
    var_dump(strrpos($foo, '7', -5));

    // Looking for 'c' right to left from the 2nd byte from the end
    var_dump(strrpos($foo, 'c', -2));

    // Looking for '9c' right to left from the 2nd byte from the end
    var_dump(strrpos($foo, '9c', -2));
    ?>

&example.outputs;

    int(0)
    bool(false)
    int(27)
    bool(false)
    int(17)
    bool(false)
    int(29)

&reftitle.seealso;

- `strpos`
- `stripos`
- `strripos`
- `strrchr`
- `substr`