When working with multibyte character encodings, PHP offers the iconv_strrpos function to find the position of the last occurrence of a substring within a string. This function is especially important for handling UTF-8 and other multibyte encodings, since the standard strrpos can miscalculate positions due to byte-level splits. However, as PHP versions have evolved, subtle changes in the behavior of iconv_strrpos have appeared. Understanding these differences is crucial for developers to avoid potential compatibility issues.
iconv_strrpos works similarly to strrpos and is defined as follows:
int iconv_strrpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = ini_get("iconv.internal_encoding") ]] )
$haystack: The string to search in.
$needle: The substring to find.
$offset: The search start position (default is 0, negative values supported).
$encoding: The character encoding of the string, defaulting to iconv.internal_encoding.
The return value is the character position of the last occurrence of $needle (based on characters, not bytes), or false if not found.
iconv_strrpos had unstable behavior when handling the $offset parameter. Negative offsets sometimes did not work properly and could even cause erroneous results.
The default encoding relied on iconv.internal_encoding, which if not explicitly set, could cause failures in recognizing multibyte encodings.
There were bugs causing abnormal return values when $needle was longer than one character.
Handling of $offset became more precise, with full support for negative values consistent with documentation.
It is recommended to explicitly pass the encoding parameter to reduce dependency on configuration and avoid environment-related discrepancies.
Issues with multibyte $needle matching and return value offsets were resolved, improving performance and stability.
Some edge-case bugs existed before PHP 7.2; upgrading to PHP 7.3+ is advised for more reliable behavior.
iconv_strrpos depends on the correct encoding parameter. Otherwise, it may miscalculate string lengths or fail to match. Always explicitly specify $encoding, preferably as:
$pos = iconv_strrpos($str, $needle, 0, 'UTF-8');
$offset is a character-based index, not byte-based.
Negative values mean the offset is counted from the end of the string backwards.
Early PHP versions poorly supported negative offsets; be mindful of version compatibility.
The return value is the character position starting at 0, not the byte position.
If the substring is not found, it returns false. Since false and integer 0 can be confused in type checks, use strict comparison as follows:
if ($pos === false) {
echo "Substring not found";
} else {
echo "Position is: $pos";
}
When $needle contains multibyte characters, PHP 7+ handles matching more accurately. Avoid substituting iconv_strrpos with single-byte string functions to prevent garbled results or offset errors.
<?php
// Assume $str contains Chinese characters
$str = "这是一个测试字符串测试";
<p>// Recommended PHP 7+ usage with explicit encoding<br>
$needle = "测试";<br>
$pos = iconv_strrpos($str, $needle, 0, 'UTF-8');</p>
<p>if ($pos !== false) {<br>
echo "Last occurrence position is: $pos\n";<br>
} else {<br>
echo "Substring not found\n";<br>
}<br>
Output:
Last occurrence position is: 8
In older versions, omitting the encoding parameter could produce incorrect output or false.
iconv_strrpos is an indispensable function for multibyte string handling, but its behavior depends on PHP version and encoding settings.
Always explicitly specify encoding to avoid reliance on defaults.
Ensure PHP 7 or later is used to benefit from full support of negative $offset values.
Be cautious when checking return values to distinguish between 0 and false.
When upgrading PHP versions, perform compatibility tests on related functions to ensure correct program execution.