Php позиция последнего вхождения символа

strrchr

Возвращает подстроку строки haystack , начиная с последнего вхождения needle до конца строки.

Список параметров

Строка, в которой производится поиск

Если needle состоит более чем из одного символа, используется только первый символ. Это поведение отличается от strstr() .

До PHP 8.0.0, если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов chr() .

Возвращаемые значения

Функция возвращает фрагмент строки, или false , если подстрока needle не найдена.

Список изменений

Версия Описание
8.0.0 Передача целого числа ( int ) в needle больше не поддерживается.
7.3.0 Передача целого числа ( int ) в needle объявлена устаревшей.

Примеры

Пример #1 Пример использования strrchr()

// получить последнюю директорию из $PATH
$dir = substr ( strrchr ( $PATH , «:» ), 1 );

// получить все после последнего перевода строки
$text = «Line 1\nLine 2\nLine 3» ;
$last = substr ( strrchr ( $text , 10 ), 1 );
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strstr() — Находит первое вхождение подстроки
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке

User Contributed Notes 10 notes

/**
* Removes the preceeding or proceeding portion of a string
* relative to the last occurrence of the specified character.
* The character selected may be retained or discarded.
*
* Example usage:
*
* $example = 'http://example.com/path/file.php';
* $cwd_relative[] = cut_string_using_last('/', $example, 'left', true);
* $cwd_relative[] = cut_string_using_last('/', $example, 'left', false);
* $cwd_relative[] = cut_string_using_last('/', $example, 'right', true);
* $cwd_relative[] = cut_string_using_last('/', $example, 'right', false);
* foreach($cwd_relative as $string) <
* echo "$string
".PHP_EOL;
* >
*

*
* Outputs:
*
* http://example.com/path/
* http://example.com/path
* /file.php
* file.php
*

*
* @param string $character the character to search for.
* @param string $string the string to search through.
* @param string $side determines whether text to the left or the right of the character is returned.
* Options are: left, or right.
* @param bool $keep_character determines whether or not to keep the character.
* Options are: true, or false.
* @return string
*/
function cut_string_using_last ( $character , $string , $side , $keep_character = true ) <
$offset = ( $keep_character ? 1 : 0 );
$whole_length = strlen ( $string );
$right_length = ( strlen ( strrchr ( $string , $character )) — 1 );
$left_length = ( $whole_length — $right_length — 1 );
switch( $side ) <
case ‘left’ :
$piece = substr ( $string , 0 , ( $left_length + $offset ));
break;
case ‘right’ :
$start = ( 0 — ( $right_length + $offset ));
$piece = substr ( $string , $start );
break;
default:
$piece = false ;
break;
>
return( $piece );
>
?>

just a small addition to carlos dot lage at gmail dot com note which makes it a bit more useful and flexible:

// return everything up to last instance of needle
// use $trail to include needle chars including and past last needle
function reverse_strrchr ( $haystack , $needle , $trail ) return strrpos ( $haystack , $needle ) ? substr ( $haystack , 0 , strrpos ( $haystack , $needle ) + $trail ) : false ;
>
// usage:
$ns = ( reverse_strrchr ( $_SERVER [ «SCRIPT_URI» ], «/» , 0 ));
$ns2 = ( reverse_strrchr ( $_SERVER [ «SCRIPT_URI» ], «/» , 1 ));
echo( $ns . «
» . $ns2 );
?>

The function provided by marcokonopacki at hotmail dot com isn’t really a reverse-version of strrchr(), rather a reverse version of strchr(). It returns everything from the start of $haystack up to the FIRST instance of the $needle. This is basically a reverse of the behavior which you expect from strchr(). A reverse version of strrchr() would return everything in $haystack up to the LAST instance of $needle, eg:

// reverse strrchr() — PHP v4.0b3 and above
function reverse_strrchr ( $haystack , $needle )
$pos = strrpos ( $haystack , $needle );
if( $pos === false ) return $haystack ;
>
return substr ( $haystack , 0 , $pos + 1 );
>
?>

Note that this function will need to be modified slightly to work with pre 4.0b3 versions of PHP due to the return type of strrpos() (‘0’ is not necessarily ‘false’). Check the documentation on strrpos() for more info.

A function like this can be useful for extracting the path to a script, for example:

echo reverse_strrchr($string, ‘/’); // will echo «/path/to/the/file/»
?>

Источник

strripos

Ищет позицию последнего вхождения подстроки needle в строку haystack .

В отличие от strrpos() , strripos() не учитывает регистр символов.

Список параметров

Строка, в которой производится поиск.

До PHP 8.0.0, если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов chr() .

Если равно или больше ноля, то поиск будет идти слева направо и, при этом, будут пропущены первые offset байт строки haystack .

Если меньше ноля, то поиск будет идти справа налево. При этом будут отброшены offset байт с конца haystack и найдено первое найденное вхождение needle .

Замечание:

Фактически это будет последнее вхождение needle без учёта offset последних байт.

Возвращаемые значения

Возвращает номер позиции последнего вхождения needle относительно начала строки haystack (независимо от направления поиска и смещения (offset)).

Замечание: Позиция в строке строки отсчитывается от 0, а не от 1.

Возвращает false , если искомая строка не найдена.

Эта функция может возвращать как логическое значение false , так и значение не типа boolean, которое приводится к false . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия Описание
8.2.0 Преобразование регистра больше не зависит от локали, установленной с помощью функции setlocale() . Будут преобразованы только символы ASCII. Байты не ASCII-кодировке будут сравниваться по значению байта.
8.0.0 Передача целого числа ( int ) в needle больше не поддерживается.
7.3.0 Передача целого числа ( int ) в needle объявлена устаревшей.

Примеры

Пример #1 Пример использования strripos()

$pos = strripos ( $haystack , $needle );

if ( $pos === false ) echo «К сожалению, ( $needle ) не найдена в ( $haystack )» ;
> else echo «Поздравляем!\n» ;
echo «Последнее вхождение ( $needle ) найдено в ( $haystack ) в позиции ( $pos )» ;
>
?>

Результат выполнения данного примера:

Поздравляем! Последнее вхождение (aB) найдено в (ababcd) в позиции (2)

Смотрите также

  • strpos() — Возвращает позицию первого вхождения подстроки
  • stripos() — Возвращает позицию первого вхождения подстроки без учёта регистра
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке
  • strrchr() — Находит последнее вхождение символа в строке
  • stristr() — Регистронезависимый вариант функции strstr
  • substr() — Возвращает подстроку

User Contributed Notes 7 notes

Simple way to implement this function in PHP 4

if ( function_exists ( ‘strripos’ ) == false ) function strripos ( $haystack , $needle ) return strlen ( $haystack ) — strpos ( strrev ( $haystack ), $needle );
>
>

Suppose you just need a stripos function working backwards expecting that strripos does this job, you better use the following code of a custom function named strbipos:

function strbipos ( $haystack = «» , $needle = «» , $offset = 0 ) // Search backwards in $haystack for $needle starting from $offset and return the position found or false

$len = strlen ( $haystack );
$pos = stripos ( strrev ( $haystack ), strrev ( $needle ), $len — $offset — 1 );
return ( ( $pos === false ) ? false : $len — strlen ( $needle ) — $pos );
>

// Test
$body = «01234Xy7890XYz456xy90» ;
$str = «xY» ;
$len = strlen ( $body );
echo «TEST POSITIVE offset VALUES IN strbipos
» ;
for ( $i = 0 ; $i < $len ; $i ++) echo "Search in [ $body ] for [ $str ] starting from offset [ $i ]: [" . strbipos ( $body , $str , $i ) . "]» ;
>
?>

Note that this function does exactly what it says and its results are different comparing to PHP 5 strripos function.

Generally speaking, linear searches are from start to end, not end to start — which makes sense from a human perspective. If you need to find strings in a string backwards, reverse your haystack and needle rather than manually chopping it up.

OK, I guess this will be the final function implementation for PHP 4.x versions ( my previous posts are invalid )

if(! function_exists ( «stripos» )) function stripos ( $str , $needle , $offset = 0 ) return strpos ( strtolower ( $str ), strtolower ( $needle ), $offset );
> /* endfunction stripos */
> /* endfunction exists stripos */

if(! function_exists ( «strripos» )) function strripos ( $haystack , $needle , $offset = 0 ) if( ! is_string ( $needle ) ) $needle = chr ( intval ( $needle ) );
if( $offset < 0 )$temp_cut = strrev ( substr ( $haystack , 0 , abs ( $offset ) ) );
>
else $temp_cut = strrev ( substr ( $haystack , 0 , max ( ( strlen ( $haystack ) — $offset ), 0 ) ) );
>
if( ( $found = stripos ( $temp_cut , strrev ( $needle ) ) ) === FALSE )return FALSE ;
$pos = ( strlen ( $haystack ) — ( $found + $offset + strlen ( $needle ) ) );
return $pos ;
> /* endfunction strripos */
> /* endfunction exists strripos */
?>

I think you shouldn’t underestimate the length of $needle in the search of THE FIRST POSITION of it’s last occurrence in the string. I improved the posted function, with added support for offset. I think this is an exact copy of the real function:

if(! function_exists ( «strripos» )) function strripos ( $haystack , $needle , $offset = 0 ) if( $offset < 0 )$temp_cut = strrev ( substr ( $haystack , 0 , abs ( $offset ) ) );
>
else $temp_cut = strrev ( substr ( $haystack , $offset ) );
>
$pos = strlen ( $haystack ) — ( strpos ( $temp_cut , strrev ( $needle )) + $offset + strlen ( $needle ));
if ( $pos == strlen ( $haystack )) < $pos = 0 ; >
return $pos ;
> /* endfunction strripos*/
> /* endfunction exists strripos*/
?>

Sorry, I made that last post a bit prematurely. One more thing wrong with the simple php4 version is that it breaks if the string is not found. It should actually look like this:

if ( function_exists ( ‘strripos’ ) == false ) function strripos ( $haystack , $needle ) $pos = strlen ( $haystack ) — strpos ( strrev ( $haystack ), strrev ( $needle ));
if ( $pos == strlen ( $haystack )) < $pos = 0 ; >
return $pos ;
>
>
?>

Note, we now check to see if the $needle was found, and if it isn’t, we return 0.

strripos() has very strange behaviour when you provide search position. For some reason it searches forward from the given position, instead of searching backward, that is more logical.

For example if you want to find instanse of $what, previous to the last, strripos($where, $what, $last_what_pos-1) will not wark as expected. It will return $last_what_pos again and again. And that has no sence at all.

To prevent this, I just used $prev_last_what_pos = strripos(substr($where,0,$last_what_pos), $what);

Источник

strripos

Ищет позицию последнего вхождения подстроки needle в строку haystack .

В отличие от strrpos() , strripos() не учитывает регистр символов.

Список параметров

Строка, в которой производится поиск.

Если параметр needle не является строкой, то он будет преобразован к целому и обработан как код символа.

Если указан, то поиск начнется с данного количества символов с начала строки. Если передано отрицательное значение, поиск начнется с указанного количества символов от конца строки, но по прежнему будет производится поиск последнего вхождения.

Возвращаемые значения

Возвращает номер позиции последнего вхождения needle относительно начала строки haystack (независимо от направления поиска и смещения (offset)). Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.

Возвращает FALSE , если искомая строка не найдена.

Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример использования strripos()

$pos = strripos ( $haystack , $needle );

if ( $pos === false ) echo «К сожалению, ( $needle ) не найдена в ( $haystack )» ;
> else echo «Поздравляем!\n» ;
echo «Последнее вхождение ( $needle ) найдено в ( $haystack ) в позиции ( $pos )» ;
>
?>

Результат выполнения данного примера:

Поздравляем! Последнее вхождение (aB) найдено в (ababcd) в позиции (2)

Смотрите также

  • strpos() — Возвращает позицию первого вхождения подстроки
  • stripos() — Возвращает позицию первого вхождения подстроки без учета регистра
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке
  • strrchr() — Находит последнее вхождение символа в строке
  • stristr() — Регистронезависимый вариант функции strstr
  • substr() — Возвращает подстроку

Источник

Читайте также:  Глобальные стили
Оцените статью