PHP Doku:: Findet das erste Vorkommen eines Strings - function.strstr.html

Verlauf / Chronik / History: (50) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzTextverarbeitungZeichenkettenString-Funktionenstrstr

Ein Service von Reinhard Neidl - Webprogrammierung.

String-Funktionen

<<strspn

strtok>>

strstr

(PHP 4, PHP 5)

strstrFindet das erste Vorkommen eines Strings

Beschreibung

string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] )

Gibt den Teil der Zeichenkette haystack ab dem ersten Vorkommen von needle bis zum Ende von haystack zurück.

Hinweis:

Diese Funktion unterscheidet zwischen Groß- und Kleinschreibung. Soll die Suche nicht zwischen Groß- und Kleinschreibung unterscheiden, verwenden Sie stristr().

Hinweis:

Wenn Sie nur herausfinden möchten, ob ein bestimmter needle innerhalb von haystack vorkommt, verwenden Sie stattdessen die schnellere und weniger speicherintensive Funktion strpos().

Parameter-Liste

haystack

Die Eingabezeichenkette.

needle

Ist needle kein String, wird der Parameter in einen Integerwert konvertiert, der dem Ordinalwert des Zeichens entspricht.

before_needle

Ist der Wert auf TRUE gesetzt, gibt strstr() den Teil von haystack zurück, der sich vor dem ersten Vorkommen von needle befindet.

Rückgabewerte

Gibt einen Teil der Zeichenkette zurück. Wird needle nicht gefunden, wird FALSE zurückgegeben.

Changelog

Version Beschreibung
5.3.0 Der optionale Parameter before_needle wurde hinzugefügt.
4.3.0 strstr() ist nun binary safe.

Beispiele

Beispiel #1 strstr()-Beispiel

<?php
$email  
'name@example.com';
$domain strstr($email'@');
echo 
$domain// Ausgabe: @example.com

$user strstr($email'@'true); // Ab PHP 5.3.0
echo $user// Ausgabe: name
?>

Siehe auch

  • preg_match() - Führt eine Suche mit einem regulären Ausdruck durch
  • stristr() - Wie strstr, aber unabhängig von Groß- bzw. Kleinschreibung
  • strpos() - Sucht das erste Vorkommen des Suchstrings
  • strrchr() - Sucht das letzte Vorkommen eines Zeichens in einem String
  • substr() - Gibt einen Teil eines Strings zurück


15 BenutzerBeiträge:
- Beiträge aktualisieren...
hm2k at php dot net
2.08.2010 17:50
Added the optional parameter before_needle.

Now supported in PHP_Compat through the php_compat_strstr() function.

See: http://pear.php.net/package/PHP_Compat
Marcio Angel Medina
14.08.2009 22:05
use it to emulate the before_needle php V5.3

<?php
//$h = haystack, $n = needle
function strstrb($h,$n){
    return
array_shift(explode($n,$h,2));
}
//sample
echo strstrb('qwe,asd,zxc',',');
// outputs: qwe
?>

works perfect !!!
Marcio Angel Medina
8.08.2009 18:28
use it to emulate the before_needle php V5.3
<?php
//$h = haystack, $n = needle
function strstrb($h,$n){
    return
strrev(array_pop(explode($n,strrev($h))));
}
//sample
echo strstrb('qwe,asd,zxc',',');
// outputs: qwe
?>
sheyd at advisa dot fr
9.07.2009 11:19
Before PHP 5.3 to emulate $before_needle you can already have this :
 
<?php
function rstrstr($haystack, $needle)
{
    return
substr(strrev(strstr(strrev($haystack), strrev($needle))), 0, -strlen($needle));
}
?>
dpac dot mittal at gmail dot com
30.05.2009 14:37
You can emulate the $before_needle before v5.3 in a very very simple way. Just applied a bit of common sense.

Here's the code:

<?php
function strstrbef($haystack, $needle)
{
   
$needle=strrev($needle);
   
$haystack=strrev($haystack);
   
$result=strstr($haystack,$needle);
   
$result=substr($haystack,strlen($needle));
   
$result=strrev($result);
    return
$result;
}
?>
w3b_monk3y at yahoo dot com
20.01.2009 9:28
If you want to emulate strstr's new before_needle parameter pre 5.3 strtok is faster than using strpos to find the needle and cutting with substr. The amount of difference varies with string size but strtok is always faster.
tim
26.11.2007 1:42
I simplified prafe at prafesplace dot com's function:

<?php
function strstrbi($haystack, $needle, $before_needle=FALSE, $include_needle=TRUE, $case_sensitive=FALSE) {
 
//Find the position of $needle
 
if($case_sensitive) {
 
$pos=strpos($haystack,$needle);
 } else {
 
$pos=strpos(strtolower($haystack),strtolower($needle));
 }
 
 
//If $needle not found, abort
 
if($pos===FALSE) return FALSE;
 
 
//Adjust $pos to include/exclude the needle
 
if($before_needle==$include_needle) $pos+=strlen($needle);
 
 
//get everything from 0 to $pos?
 
if($before_needle) return substr($haystack,0,$pos);
 
 
//otherwise, go from $pos to end
 
return substr($haystack,$pos);
}
?>

It's now 600 bytes, down from 2k.

Also, here are replacements for strstr and stristr:

<?php
function strstr($haystack, $needle, $before_needle=FALSE) {
 
//Find position of $needle or abort
 
if(($pos=strpos($haystack,$needle))===FALSE) return FALSE;

 if(
$before_needle) return substr($haystack,0,$pos+strlen($needle));
 else return
substr($haystack,$pos);
}

function
stristr($haystack, $needle, $before_needle=FALSE) {
 
//Find position of $needle or abort
 
if(($pos=strpos(strtolower($haystack),strtolower($needle)))===FALSE) return FALSE;

 if(
$before_needle) return substr($haystack,0,$pos+strlen($needle));
 else return
substr($haystack,$pos);
}
?>
brett dot jr dot alton at gmail dot com
25.11.2007 17:02
For the needle_before (first occurance) parameter when using PHP 5.x or less, try:

<?php
$haystack
= 'php-homepage-20071125.png';
$needle = '-';
$result = substr($haystack, 0, strpos($haystack, $needle)); // $result = php
?>
prafe at prafesplace dot com
22.11.2007 6:14
If you want to use the $before_needle parameter that's only in PHP 5.3.0, I found a way to use it in lower versions.

The code is a bit hefty, but it works. It also has added $include_needle and $case_sensitive.

<?php
// ==== I don't guarantee this is faster than the PHP 6 before needle, ====
// ====  but it works for PHP below 6 atleast. ====
// ==== IT ALSO HAS INCLUDE NEEDLE BOOLEAN.. ====
function strstrbi($haystack,$needle,$before_needle,
$include_needle,$case_sensitive)
{
 
$strstr = ($case_sensitive) ? 'strstr' : 'stristr';
  if(
$before_needle!=true && $before_needle!=false && isset($before_needle)){
      die(
'PHP: Error in function '.chr(39).'$strstrbi'. chr(39).' :  parameter '. chr(39).'$before_needle'.chr(39).' is not a supplied as a boolean.');
  }
// END BOOLEAN CHECK '$before_needle'

 
if($include_needle!=true && $include_needle!=false && isset($include_needle)){
    die(
'PHP: Error in function '.chr(39).'$strstrbi'. chr(39).' : parameter '. chr(39).'$include_needle'.chr(39). ' is not a supplied as a boolean.');
  }
// END BOOLEAN CHECK '$include_needle'

 
if($case_sensitive!=true && $case_sensitive!=false && isset($case_sensitive)){
    die(
'PHP: Error in function '.chr(39).'$strstrbi' .chr(39).' : parameter '. chr(39).'$case_sensitive'.chr(39).' is not a supplied as a boolean.');
  }
// END BOOLEAN CHECK '$case_sensitive'

 
if(!isset($before_needle)){
   
$before_needle=false;
  }

  if(!isset(
$include_needle)){
   
$include_needle=true;
  }

  if(!isset(
$case_sensitive)){
   
$case_sensitive=false;
  }

  switch(
$before_needle){
    case
true:
      switch(
$include_needle){
        case
true:
         
$temp=strrev($haystack);
         
$ret=strrev(substr($strstr($temp,$needle),0));
          break;
       
// END case true : $include_needle
       
case false:
         
$temp=strrev($haystack);
         
$ret=strrev(substr($strstr($temp,$needle),1));
          break;
       
// END case false : $include_needle
     
}
      break;
   
// END case true : $before_needle
   
case false:
      switch(
$include_needle){
        case
true:
         
$ret=$strstr($haystack,$needle);
          break;
       
// END case true: $include_needle
       
case false:
         
$ret=substr($strstr($haystack,$needle),1);
          break;
       
// END case false: $include_needle
   
}
    break;
   
// END case false : $before_needle
 
}

  if(!empty(
$ret)){
    return
$ret;
  }else{
    return
false;
  }
}
// === END FUNCTION 'strstrbi'

// Example

$email  = 'user@example.com';
$domain = strstrbi($email, '@', false, false, false);
echo
$domain; // prints example.com

$user = strstrbi($email, '@', true, false, false);
echo
$user; // prints user
?>
root at mantoru dot de
10.11.2007 12:22
Please note that $needle is included in the return string, as shown in the example above. This ist not always desired behavior, _especially_ in the mentioned example. Use this if you want everything AFTER $needle.

<?php
function strstr_after($haystack, $needle, $case_insensitive = false) {
   
$strpos = ($case_insensitive) ? 'stripos' : 'strpos';
   
$pos = $strpos($haystack, $needle);
    if (
is_int($pos)) {
        return
substr($haystack, $pos + strlen($needle));
    }
   
// Most likely false or null
   
return $pos;
}

// Example
$email = 'name@example.com';
$domain = strstr_after($email, '@');
echo
$domain; // prints example.com
?>
gigaman2003 at halfempty dot co dot uk
24.02.2007 21:48
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.

<?php
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.

6.06.2005 18: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
leo dot nard at free dot fr
24.05.2005 11:12
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: "à&a" => the second character is cut.

This function will remove any unterminated HTML special characters from the string...

<?php
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;
}
?>
Romuald Brunet
21.01.2004 21:25
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 at silisoftware dot com
15.02.2003 0:37
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:

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

<?php
$string
= strstr("one#two\x00three", "\x00");
// PHP 4.2.x:  $string contains ""
// PHP 4.3.0:  $string contains "\x00three"
?>



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)