downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

strrev> <strpos
[edit] Last updated: Fri, 26 Apr 2013

view this page in

strrchr

(PHP 4, PHP 5)

strrchrFind the last occurrence of a character in a string

Description

string strrchr ( string $haystack , mixed $needle )

This function returns the portion of haystack which starts at the last occurrence of needle and goes until the end of haystack.

Parameters

haystack

The string to search in

needle

If needle contains more than one character, only the first is used. This behavior is different from that of strstr().

If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.

Return Values

This function returns the portion of string, or FALSE if needle is not found.

Changelog

Version Description
4.3.0 This function is now binary safe.

Examples

Example #1 strrchr() example

<?php
// get last directory in $PATH
$dir substr(strrchr($PATH":"), 1);

// get everything after last newline
$text "Line 1\nLine 2\nLine 3";
$last substr(strrchr($text10), );
?>

Notes

Note: This function is binary-safe.

See Also

  • strstr() - Find the first occurrence of a string
  • strrpos() - Find the position of the last occurrence of a substring in a string



strrev> <strpos
[edit] Last updated: Fri, 26 Apr 2013
 
add a note add a note User Contributed Notes strrchr - [20 notes]
up
2
readless at gmx dot net
6 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
1
7 years ago
$filename = 'strrchr_test.php';
print strrchr( $filename, '.' );

Result:
.php

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

Result:
.php
up
1
matthewkastor at live dot com
2 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
1
jphansen at uga dot edu
8 months ago
To extract your portion of a string without the actual character you searched for, you can use:

<?php
$path
= '/www/public_html/index.html';
$filename = substr(strrchr($path, "/"), 1);
echo
$filename; // "index.html"
?>
up
0
pnoexz at gmail dot com
4 years ago
Here is my function that returns the type of a file. I fint it easier to add other types of files, and simplier than the rest i have seen around.

<?php
function findExt($filename){
   
$exts = array(
       
'.jpg' => 'image',
       
'.png' => 'image',
       
'.php' => 'php',
       
'.html' => 'html',
       
'.swf' => 'flash',
       
'.gz' => 'compressed',
       
'.tar' => 'compressed',
    );
   
$ext = strrchr($filename,'.');
    if (
$exts[$ext]) { return $exts[$ext]; }
    else { return
"unknown"; }
}
?>
up
0
freakinunreal at hotmail dot com
7 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
0
dchris1 at bigpond dot net dot au
9 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
0
andfarm at thibs dot menloschool dot org
9 years ago
strrchr is also very useful for finding the extension of a file. For example:

$ext = strrchr($filename, ".");

and $ext will contain the extension of the file, including a ".", if the file has an extension, and FALSE if the file has no extension. If the file has multiple extensions, such as "evilfile.jpg.vbs", then this construction will just return the last extension.
up
0
repley at freemail dot it
6 years ago
Get file name and extension into an array with or without dot, using strrchr and strrchr_reverse.

<?
//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.
       $a = array($left, $right);
       return $a;
   }else{
       return false;
   }
}

//start test
$haystack = "unknown.txt.log.......gif.....jpeg";
$needle = ".";
$l_inclusive = 1; //1 for inclusive mode, 0 for NOT inclusive mode
$r_inclusive = 1; //1 for inclusive mode, 0 for NOT inclusive mode

$a = strxchr($haystack, $needle, $l_inclusive, $r_inclusive);
if($a){echo "Left: <strong>" . $a[0] . "</strong><br /> Right: <strong>" . $a[1] . "</strong>";}else{echo "Failed!";}
//end test
?>

Thanks to all.

Repley
up
0
sekati at gmail dot com
7 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
0
arcesis - gmail - com
7 years ago
A quick way to get file's extension (if it has one, otherwise you get an empty string), which can be used when you want to rename the file but keep the old extension. Or for similar purposes. Temporary variable is used just because it's slightly faster to store the value than to run the strrchr() function again.

<?php
$ext
= substr(($t=strrchr("file.ext",'.'))!==false?$t:'',1);
?>
up
0
marcokonopacki at hotmail dot com
10 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
-1
corey [works at] effim [dot coooom]
3 years ago
Easiest way to get the domain off of an email:

<?php

$domain
= strrchr($email, '@');

// gets @gmail.com, with the preceding @.

?>

It's not perfect (see above in the manual), but it's pretty damn good.
up
-1
franzemmanuel at gmail dot com
3 years ago
this functions returns the full path of the current directory.
 
<?php

function CurrentFullPath()
{
   
$root = $_SERVER['DOCUMENT_ROOT'] ;
   
$self = $_SERVER['PHP_SELF'] ;
    return
$root.mb_substr($self,0,-mb_strlen(strrchr($self,"/"))) ;
}

echo
CurrentFullPath() ;

/*

If path is $path = "/home/me/www/pictures/control.php" ;

It will return :

/home/me/www/pictures

*/

?>
up
-1
Emmanuel Quiban
4 years ago
strrchr is useful also in determining file extensions.

Here is a sample code that determines the file type based on its file extension. This is useful in displaying the files in your page, without using the database for the file description list.

<?php
 
/* File Extension Display using arrays
     by: Emmanuel Quiban (Philippines)
     BSCS 2002, AdU
     21-May-2008
 */

 // Sample file
 
$filesample = "Mydocu.doc";

 
//Array for file description. You can expand the array list further with other file types you want
 
$filedes = array(
               
"Microsoft Excel Worksheet",
               
"Microsoft Word Document",
               
"Adobe Reader PDF File");

 
//Array for file extensions. Please take note that positions between the two arrays should be in sync with each other for correct file description.
 
$fileext = array(".xls", ".doc", ".pdf");

 
//This gets the file extension
 
$ext = strrchr($filesample,'.');

 
//This conditional statement checks if the file extension given is in the array and matches it with the file description
 
if (in_array($ext,$fileext)) {

       
//Search the array
       
$ext2 = array_search($ext, $fileext);

       
//Since the result of the array_search is in integer, you can now assign it as an array value
       
$filetype = $filedes[$ext2];

       
//Show the result
       
echo $filetype;
 } else {
       
$filetype = "Unknown file type";
 }
?>
-----
The output of the script above is:
Microsoft Word Document

Let's say even if the filename looks like "My.Docu.doc", strrchr still gets the value ".doc" because it gets the last occurance of the dot.
-----

You can also make it as a function, like this:

<?php
 
/* File Extension Display using arrays
     by: Emmanuel Quiban (Philippines)
     BSCS 2002, AdU
     21-May-2008
 */
 
function getFileType($yourfile){

 
$filedes = array(
               
"CompuServe GIF Image",
               
"JPEG Image",
               
"Portable Network Graphics (PNG) Image"
               
);

 
$fileext = array(".gif",".jpg",".png");

 
$ext = strrchr($yourfile,'.');
 if (
in_array($ext,$fileext)) {
       
$ext2 = array_search($ext, $fileext);
       
$filetype = $filedes[$ext2];
 } else {
       
$filetype = "Unknown file type";
 }

 return
$filetype;
 }
?>
up
-1
repley at freemail dot it
6 years ago
Final get file name and extension into an array with or without dot, using strrchr and strrchr_reverse.
Note our use of !==. Now work if the position of $needle in $haystack was the 0th (first) character like ".htaccess"
<?
//strxchr(string haystack, string needle [, bool int leftinclusive [, bool int rightinclusive ]])
function strxchr($haystack, $needle, $l_inclusive = 0, $r_inclusive = 0){
   //Note our use of !==. Now work if the position of $needle in $haystack was the 0th (first) character.
   if(strrpos($haystack, $needle) !== false){
       //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.
       $a = array($left, $right);
       return $a;
   }else{
       return false;
   }
}
?>

Repley
up
-1
carlos dot lage at gmail dot com
8 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;
}
?>
up
-2
equand at gmail dot com
4 years ago
a KiSS variant of a previous note

<?php
function fcheck($f = "test.doc")
{
 
$fd = array(".xls" => "Microsoft Excel Worksheet",".doc" => "Microsoft Word Document",".pdf" => "Adobe Reader PDF File");
 
$s = $fd[strrchr($f,'.')];
 if (!empty(
$s))
 {
  return
$s;
 }
 else
 {
  return
"Unknown file type";
 }
}

?>
up
-2
subbz2k at yahoo dot de
5 years ago
i just recently did a function, that uses strrchr to format - let's say a currency - with 2 decimals. can also be done using number_format but you may NOT always want an automatic rounding of your decimals. thats there this function comes in handy:

<?php
function formatTwoDecimals($value, $trim)
{
  
$after_comma = substr(strrchr($value, $trim), 0, 3);
  
$in_front_of_comma = (int) $value;
  
$final = $in_front_of_comma . $after_comma;

   return
$final;
}

echo
formatTwoDecimals("365.6078985", ".");
?>

this will produce
365.60

instead of
365.61
which will show up then you use number_format.
up
-2
juancri at tagnet dot org
10 years ago
this functions returns the name of the current directory.
<?php
function currentd() {
    return
substr(strrchr(`pwd`, '/'), 1);
}
?>

 
show source | credits | stats | sitemap | contact | advertising | mirror sites