Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : String Functions : strstr

strstr

Find first occurrence of a string (PHP 4, PHP 5)
string strstr ( string haystack, string needle, bool before_needle )

Example 2466. strstr() example

<?php
$email  
= 'name@example.com';
$domain = strstr($email, '@');
echo
$domain; // prints @example.com

$user = strstr($email, '@', true);
echo
$user; // prints name
?>

Related Examples ( Source code ) » strstr




Code Examples / Notes » strstr

joaobett

[Editor's Note: It's better to:
 substr($stringA, 0, strpos($stringA, $toFind)+1)
than to reverse the string twice (slow).]
//If you want to get the text before the occurence of the character
//you want to find, simply use the function strRev twice:
$stringA = "user@example.com";    $toFind = "@";
echo strrev( strchr(strrev($stringA),$toFind) );
//output: user@


robbie

With regard to the below comment
<?php
$filename = "funnypicture.jpg";
$type = str_replace('.','',strstr($filename, '.'));
echo $type; // jpg
?>
This gets the file extension into the variable $type, not the file type.
To get the file type, use filetype(), or to get the MIME content type, use mime_content_type().
<?php
$filename = "funnypicture.jpg";
$ext = str_replace('.','',strstr($filename, '.'));
$type = filetype($filename);
$mime = mime_content_type($filename);
echo $ext;     // jpg
echo $type;   // file
echo $mime; //  image/jpeg
?>


leo dot nard

When encoding ASCII strings to HTML size-limited strings, sometimes some HTML special chars were cut.
For example, when encoding "àà" to a string of size 10, you would get: "&agrave;&a" => the second character is cut.
This function will remove any unterminated HTML special characters from the string...
function cut_html($string)
{
$a=$string;
while ($a = strstr($a, '&'))
{
echo "'".$a."'\n";
$b=strstr($a, ';');
if (!$b)
{
echo "couper...\n";
$nb=strlen($a);
return substr($string, 0, strlen($string)-$nb);
}
$a=substr($a,1,strlen($a)-1);
}
return $string;
}


06-jun-2005 05:13

suggestion for [leo dot nard at free dot fr]:
to be able to cut the string without having the html entities being cut in half, use this instead:
<?php
$oldstr = "F&ouml;r att klippa av en str&auml;ng som inneh&aring;ller skandinaviska (eller Franska, f&ouml;r den delen) tecken, kan man g&ouml;ra s&aring;h&auml;r...";
$length = 50;
# First, first we want to decode the entities (to get them as usual chars), then cut the string at for example 50 chars, and then encoding the result of that again.
# Or, as I had it done, in one line:
$newstr = htmlentities(substr(html_entity_decode($oldstr), 0, $length));
$newstr2 = substr($oldstr, 0, $length);
# It's not quite as much code as the snippet you've coded to remove the half-portions... ;)
# Hopefully somebody finds this useful!
echo "Without the decode-encode snippet:
$newstr2
With the decode-encode snippet:
$newstr";
?>
The above outputs this:
Without the decode-encode snippet:
F&ouml;r att klippa av en str&auml;ng som inneh&ar
With the decode-encode snippet:
F&ouml;r att klippa av en str&auml;ng som inneh&aring;ller skandin
First post in this db ;)
Best regards, Mikael Rönn, FIN


nin

Since I managed to do this in a few seconds, why not let it out to someone in the same need ...
Based on the above idea, since I had:
$string = "Some text (some note) some other text";
And say you just wanted whats *between* the parentheses (or between basically anything):
<?
function remover($string, $sep1, $sep2)
{
       $string = substr($string, 0, strpos($string,$sep2));
       $string = substr(strstr($string, $sep1), 1);
       return $string;
}
$string = "Some text (some note) some other text";
$str1 = "(";
$str2 = ")";
echo remover($string, $str1, $str2);
?>


romuald brunet

Regarding the note of the manual concerning the speed of strstr against strpos, for people who wants to check a needle occurs within haystack, it apprears that strstr() is in facts faster than strpos().
Example:
<?php
// [VERY] Quick email check:
if ( strstr("email@domain.tld", "@") ) {
// Ok
}
?>
is faster than
<?php
if ( strpos("email@domain.tld", "@") !== FALSE ) {
// Ok
}
Without using the true equality with !==, strpos() is faster. But then if the haystack starts with needle the condition whould not be met.


php

PHP versions before 4.3.0 (tested on 4.2.2 and 4.2.3) return the $haystack from $needle only up to the first null character. So for example:
$string = strstr("one#two\x00three", "#");
// PHP 4.2.x:  $string contains "#two"
// PHP 4.3.0:  $string contains "#two\x00three"
If you're trying to match nulls, you will probably get back an empty string:
$string = strstr("one#two\x00three", "\x00");
// PHP 4.2.x:  $string contains ""
// PHP 4.3.0:  $string contains "\x00three"


gigaman2003

Often you will need to find all occurrences of a string (for security escapes and such)
So I wrote this function to return an array with the locations of all the occurrences. Almost like an advanced strstr.
function findall($needle, $haystack)
{
//Setting up
$buffer=''; //We will use a 'frameshift' buffer for this search
$pos=0; //Pointer
$end = strlen($haystack); //The end of the string
$getchar=''; //The next character in the string
$needlelen=strlen($needle); //The length of the needle to find (speeds up searching)
$found = array(); //The array we will store results in

while($pos<$end)//Scan file
{
$getchar = substr($haystack,$pos,1); //Grab next character from pointer
if($getchar!="\n" || buffer<$needlelen) //If we fetched a line break, or the buffer is still smaller than the needle, ignore and grab next character
{
$buffer = $buffer . $getchar; //Build frameshift buffer
if(strlen($buffer)>$needlelen) //If the buffer is longer than the needle
{
$buffer = substr($buffer,-$needlelen);//Truncunate backwards to needle length (backwards so that the frame 'moves')
}
if($buffer==$needle) //If the buffer matches the needle
{
$found[]=$pos-$needlelen+1; //Add the location of the needle to the array. Adding one fixes the offset.
}
}
$pos++; //Increment the pointer
}
if(array_key_exists(0,$found)) //Check for an empty array
{
return $found; //Return the array of located positions
}
else
{
return false; //Or if no instances were found return false
}
}
Haven't had the chance to speed test it, but many optimizations should be possible. It just works enough for me. Hope it saves someone a lot of time.


giunta dot gaetano

Note to Rolf's post: if the needle is NOT found, the function proposed will truncate the last char of the string!

nospam

It is a good practice to ensure dropdown menu submissions contain ONLY expected values:
$i=(isset($_POST['D1']))?$_POST['D1']:$o="Monday";
if (!stristr('Monday Tuesday Wednesday Thursday Friday Saturday Sunday',$i)) die();
(do database query)
This should protect against all known and unknown attacks, injection, etc.
User submitted should be cleaned through other functions.  See info under mysql_query


mario

If you would like to count files on a directory, this might be helpful.  In this case I wanted to create a random image generator, but not have to keep track of the image count. Example: I have 4 images, and choose a random number between 1-4.  If I decide to add a 5th and 6th image, I would have to generate at random 1-6. STRSTR can help you keep track of the amount of images, without you having to update the code.
NOTE, this example is based on the naming convention
image1.gif
image2.gif
image3.gif
""""""""4"""
etc....
If you are not using it, then just make the adjustments.
------------------------------------------------------
//First a function. $path is where you want to count files
//$filter is the criteria. Ex. File names with "image" in it.
function countfiles($path, $filter)
{
$dir = opendir($path);
while ($file = readdir($dir)){
     if(strstr($file, $filter)){ $i++; }
}//end while
closedir($dir);
return $i;
}
//-------------------------------------------------
$max = countfiles("/you directory", "image");
$num = rand(1,$max);
$image = "image";
$image.= $num;
$image.= ".gif";  // or jpg, png, etc
echo "<img scr=\"$image\">";


crypto

I've noticed that :
$string = substr($string, 0, strpos($string,$separat));
returns the first par of the string (before $separat) only if there is $separat in the string !
But
$string = substr($string, 0, strlen($string)-strlen (strstr ($string,$separat)));
works anyway ...
That can be useful !
/Crypto


rolf dot winterscheidt

Get the first part of the string can be so easy:
$data="ID: 1, Rolf Winterscheidt, and so on";
$id=substr($data, 0 , strpos($data, ",")-1);
-> $id is now "ID: 1"
Best regards,
Rolf


fire.minded.design

for eamon:
preg_replace is wonderful for that sort of thing, amongst so much else.
<?php
$string = "a string with!0o|u7t stuf34-f2~ in#4 in it";
// No numbers
$string = preg_replace("![0-9]!", "", $string);
// $string is now "a string with!o|ut stuf-f~ in# in it"
// Nothing but alphabetic
$string = preg_replace("![^0-9A-Za-z\s]!", "", $string);
// $string is now "a string without stuff in in it"
?>


redzia

Example usage of fopen to remove line containing a key string
<?
$key = "w3ty8l";
//load file into $fc array
$fc=file("some.txt");
//open same file and use "w" to clear file
$f=fopen("some.txt","w");
//loop through array using foreach
foreach($fc as $line)
{
     if (!strstr($line,$key)) //look for $key in each line
           fputs($f,$line); //place $line back in file
}
fclose($f);
?>


eric

Example 1. stristr() example
<?php
 $email = 'USER@EXAMPLE.com';
 echo stristr($email, 'e');
// outputs ER@EXAMPLE.com
?>
Example 2. Testing if a string is found or not
<?php
 $string = 'Hello World!';
 if(stristr($string, 'earth') === FALSE) {
   echo '"earth" not found in string';
 }
// outputs: "earth" not found in string
?>
Example 3. Using a non "string" needle
<?php
 $string = 'APPLE';
 echo stristr($string, 97); // 97 = lowercase a
// outputs: APPLE
?>
I use this a lot at http://www.linksback.org


ami hughes ami

Because I was working with two different sets of variables and wanted to combine the result into a decimal format, I needed to strip the zero before the decimal.  As an added bonus, this will strip anything before a decimal (or period), which might be useful for other things.  So, if you are trying to combine apples and oranges like I was, or whatever, try this.  =)
<?php
$number = '0.529';
strstr($number,'.');
echo $number; // returns .529
?>


eamon

After some interesting projects that required the use of requiring only the chars of any given string i thought i'll just put it up. Simple code.
<?php
function strchrs($str)
{
$n = strlen($str);
$w = "";
for($i = 0; $i < $n; $i ++)
{
if(!is_numeric($str[$i]))
$w .= $str[$i];
}
return $w;
}
?>
Hey I'm building a new DB & Datasource abstraction layer, the framework's been built does anyone wannt help out. I need someone with a SYBASE database, and I'm also working on some new ways of dealing with XML contact me as I don't have much time to complete it. It's actually 3x faster than MDB2, and because it doesn't require PEAR its easier to install. Only OOP developers plz.


schultz

a nice way to decide wether a string starts with a certain prefix, one can use this condition...
$url = 'http://www.widescreen.ch';
$isUrl = ( strstr($url,'http://') == $url );
have  fun!
Lars


rodrigo

A better solution for nicolas at bougues dot net's problem below is to use
<?
strstr ("0", "0") === FALSE
?>
instead of
<?
strstr ("0", "0") == FALSE
?>
or
<?
is_string (strstr ("0", "0"))
?>


christian dywan

@Eric:
Please do not test for the occurence of  a substring with strstr. As you should already have read above, strpos is much faster for this.


always_sleepz0r

//this is my little version
function rdir($d_d, $filter = null) {
$d = dir($d_d);while(false !== ($entry = $d->read())) {
if ($entry!=".." && $entry!="." && $filter==null || true==stristr($entry, $filter)){ if (!is_dir($entry)) {
    $ret_arr['f'][]=$entry;}else{$ret_arr['d'][]=$entry;
}}}$d->close();return $ret_arr;}
//usage:
$d="folder";
$dd=rdir($d);
//will return array with all files and folder names
$dd=rdir($d, "requiredneedle");
//will return array with only file/folder names containing "requiredneedle".
//$dd['f'] = files and $dd['d'] = folders
echo "<pre>";print_r($dd);echo "</pre>";


teezee

//Checking and using the above string can be done much easier:
$data="ID: 1, Rolf Winterscheidt, and so on";
$data_array = explode(",",$data);
//will return an array:
$data[0] = ID: 1
$data[1] =  Rolf Winterscheidt
$data[2] =  and so on


steve

// I needed to find the content between 2 chrs in a string and this was the quickest method I could find.
function SeekVal($str_in) {
$tween="";  // not needed but good practise when appending
$chr1='[';
$chr2=']';
for ($i=strpos($str_in, $chr1);$i<strpos($str_in, $chr2);$i++)
 $tween=$tween+$str_in[$i];
return $tween;    
}


Change Language


Follow Navioo On Twitter
addcslashes
addslashes
bin2hex
chop
chr
chunk_split
convert_cyr_string
convert_uudecode
convert_uuencode
count_chars
crc32
crypt
echo
explode
fprintf
get_html_translation_table
hebrev
hebrevc
html_entity_decode
htmlentities
htmlspecialchars_decode
htmlspecialchars
implode
join
levenshtein
localeconv
ltrim
md5_file
md5
metaphone
money_format
nl_langinfo
nl2br
number_format
ord
parse_str
print
printf
quoted_printable_decode
quotemeta
rtrim
setlocale
sha1_file
sha1
similar_text
soundex
sprintf
sscanf
str_getcsv
str_ireplace
str_pad
str_repeat
str_replace
str_rot13
str_shuffle
str_split
str_word_count
strcasecmp
strchr
strcmp
strcoll
strcspn
strip_tags
stripcslashes
stripos
stripslashes
stristr
strlen
strnatcasecmp
strnatcmp
strncasecmp
strncmp
strpbrk
strpos
strrchr
strrev
strripos
strrpos
strspn
strstr
strtok
strtolower
strtoupper
strtr
substr_compare
substr_count
substr_replace
substr
trim
ucfirst
ucwords
vfprintf
vprintf
vsprintf
wordwrap
eXTReMe Tracker