Я думаю, ты делаешь это сложнее, чем нужно.Если rev_strpos
требуется только для возврата последнего экземпляра строки поиска, , и если вас не беспокоит случай , используйте вместо него strripos
.
Из документов PHP ...
strripos - Найти позицию последнего появления строки без учета регистра в строке
Описание
int strripos ( string $haystack , string $needle [, int $offset = 0 ] )
Найти позицию последнего вхождения строки в строку.В отличие от strrpos (), strripos () нечувствителен к регистру.
Если вам нужно, чтобы он был чувствительным к регистру, или просто по какой-то причине хотите использовать собственную функцию, проблема в том, как вырассчитываем смещение.В частности, в этих 2 строках:
$offset = $length - $foffset - 1;
$pos = strpos(strrev($haystack), strrev($needle), $offset);
Используя ваш пример "Некоторый текст ..." и ища "google.com", если мы не указываем смещение, вычисляется смещение как длина (500chars) - offset (0 chars) - 1. Затем вы используете strpos для строки длиной 500 символов, начиная с символа смещения 499. Вы никогда не найдете ничего подобным.
Поскольку вы меняете направлениестог сена, а также ваша игла, вам нужно "повернуть" смещение.Измените строку на:
$pos = strpos(strrev($haystack), strrev($needle), $length - $offset);
(На самом деле, вы должны изменить предыдущую строку, чтобы вычислить смещение $, где вы хотите, но вы получите точку ...)
ОБНОВЛЕНИЕ:
В дополнение к рекомендациям по использованию Regex очень просто получить местоположения:
function getOffsets( $url, $baseRegex, $text ){
$results = array();
$regex= str_replace( '%URL%', $url, $baseRegex );
preg_match_all( $regex, $text, $matches, PREG_OFFSET_CAPTURE );
foreach ( $matches[0] as $match )
array_push( $results, ($match[1] + strpos( $match[0], $url )) );
return $results;
}
$linkRegex = '/<a[^>]*href="[^"]*%URL%[^"]*"[^>]*>/i';
$linkLocations = getOffsets( $url, $linkRegex, $text );
//Array
//(
// [0] => 395
//)
$anyRegex = '/%URL%/i';
$allLocations = getOffsets( $url, $anyRegex, $text );
$nonlinkLocations = array_diff( $allLocations, $linkLocations ); //all non-links
//Array
//(
// [0] => 188
//)
Это действительно должно быть предпочтительнееуловки петли rev_strpos
& while
.