PHP 8.4.2 Released!

strrchr

(PHP 4, PHP 5, PHP 7, PHP 8)

strrchrEncontra a última ocorrência de um caractere em uma string

Descrição

strrchr(string $haystack, string $needle, bool $before_needle = false): string|false

Esta função retorna a porção de haystack que inicia na última ocorrência de needle e continua até o final de haystack.

Parâmetros

haystack

A string na qual a pesquisa será realizada.

needle

Se needle contiver mais de um caractere, apenas o primeiro será usado. Este comportamento é diferente quando comparado com strstr().

Antes do PHP 8.0.0, se needle não for uma string, ela será convertida para um número inteiro e aplicada como o valor ordinal de um caractere. Este comportamento tornou-se defasado a partir do PHP 7.3.0 e depender dele é altamente desaconselhado. Dependendo do comportamento pretendido, o parâmetro needle deve ser explicitamente convertido em string ou uma chamada explícita para chr() deve ser realizada.

before_needle

Se for true, strrchr() retorna a parte de haystack antes da última ocorrência do caractere needle (excluindo o caractere).

Valor Retornado

Esta função retorna a porção de uma string, ou false se needle não for encontrado.

Registro de Alterações

Versão Descrição
8.3.0 O parâmetro before_needle foi adicionado.
8.0.0 O parâmetro needle agora aceita uma string vazia.
8.0.0 Passar um int em needle não é mais suportado.
7.3.0 Passar um int em needle tornou-se defasado.

Exemplos

Exemplo #1 Exemplo de strrchr()

<?php
$ext
= strrchr('algum_arquivo.txt', '.');
echo
"extensão do arquivo: $ext \n";
$ext = $ext ? strtolower(substr($ext, 1)) : '';
echo
"extensão do arquivo: $ext";
?>

O exemplo acima produzirá algo semelhante a:

extensão do arquivo: .txt
extensão do arquivo: txt

Notas

Nota: Esta função é compatível com dados binários.

Veja Também

  • strstr() - Encontra a primeira ocorrência de uma string
  • strrpos() - Encontra a posição da última ocorrência de uma substring em uma string

adicione uma nota

Notas Enviadas por Usuários (em inglês) 8 notes

up
31
matthewkastor at live dot com
13 years ago
<?php
/**
* 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:
* <code>
* $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 <br>".PHP_EOL;
* }
* </code>
*
* Outputs:
* <code>
* http://example.com/path/
* http://example.com/path
* /file.php
* file.php
* </code>
*
* @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);
}
?>
up
12
sekati at gmail dot com
18 years ago
just a small addition to carlos dot lage at gmail dot com note which makes it a bit more useful and flexible:

<?php
// 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 . "<br>" . $ns2);
?>
up
6
dchris1 at bigpond dot net dot au
20 years ago
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:

<?php
// 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:

<?
$string = "/path/to/the/file/filename.php";

echo reverse_strrchr($string, '/'); // will echo "/path/to/the/file/"
?>
up
6
readless at gmx dot net
18 years ago
to: repley at freemail dot it

the code works very well, but as i was trying to cut script names (e.g.: $_SERVER["SCRIPT_NAME"] => /index.php, cut the string at "/" and return "index.php") it returned nothing (false). i've modified your code and now it works also if the needle is the first char.
- regards from germany

<?php
//strxchr(string haystack, string needle [, bool int leftinclusive [, bool int rightinclusive ]])
function strxchr($haystack, $needle, $l_inclusive = 0, $r_inclusive = 0){
if(
strrpos($haystack, $needle)){
//Everything before last $needle in $haystack.
$left = substr($haystack, 0, strrpos($haystack, $needle) + $l_inclusive);

//Switch value of $r_inclusive from 0 to 1 and viceversa.
$r_inclusive = ($r_inclusive == 0) ? 1 : 0;

//Everything after last $needle in $haystack.
$right = substr(strrchr($haystack, $needle), $r_inclusive);

//Return $left and $right into an array.
return array($left, $right);
} else {
if(
strrchr($haystack, $needle)) return array('', substr(strrchr($haystack, $needle), $r_inclusive));
else return
false;
}
}
?>
up
4
freakinunreal at hotmail dot com
19 years ago
to marcokonopacki at hotmail dot com.

I had to make a slight change in your function for it to return the complete needle inclusive.

// Reverse search of strrchr.
function strrrchr($haystack,$needle)
{

// Returns everything before $needle (inclusive).
//return substr($haystack,0,strpos($haystack,$needle)+1);
// becomes
return substr($haystack,0,strpos($haystack,$needle)+strlen($needle));
}

Note: the +1 becomes +strlen($needle)

Otherwise it only returns the first character in needle backwards.
up
7
Primo Anderson Do S?tio
19 years ago
$filename = 'strrchr_test.php';
print strrchr( $filename, '.' );

Result:
.php

$other_filename = 'strrchr_test.asp.php';
print strrchr( $other_filename, '.' );

Result:
.php
up
0
marcokonopacki at hotmail dot com
21 years ago
<?

// Reverse search of strrchr.
function strrrchr($haystack,$needle)
{

// Returns everything before $needle (inclusive).
return substr($haystack,0,strpos($haystack,$needle)+1);

}

$string = "FIELD NUMBER(9) NOT NULL";

echo strrrchr($string,")"); // Will print FIELD (9)

?>
up
-5
carlos dot lage at gmail dot com
19 years ago
I used dchris1 at bigpond dot net dot au 's reverse strrchr and reduced it to one line of code and fixed it's functionality - the real strrchr() returns FALSE if the needle is not found, not the haystack :)

<?php
// reverse strrchr()
function reverse_strrchr($haystack, $needle)
{
return
strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) +1 ) : false;
}
?>
To Top