PHP 5.6.29 Released

strstr

(PHP 4, PHP 5, PHP 7)

strstr文字列が最初に現れる位置を見つける

説明

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

haystack の中で needle が最初に現れる場所を含めてそこから文字列の終わりまでを返します。

注意:

この関数は大文字小文字を区別することに注意してください。 大文字小文字を区別しない検索を行う場合は、stristr() を使用してください。

注意:

もし特定の haystackneedle があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用してください。

パラメータ

haystack

入力文字列。

needle

needle が文字列でない場合は、 それを整数に変換し、その番号に対応する文字として扱います。

before_needle

TRUE にすると、strstr() の返り値は、haystack の中で最初に needle があらわれる箇所より前の部分となります (needle は含めません)。

返り値

部分文字列を返します。 needle が見つからない場合は FALSE を返します。

変更履歴

バージョン 説明
5.3.0 オプションの before_needle パラメータが追加されました。
4.3.0 strstr() がバイナリセーフとなりました。

例1 strstr() の例

<?php
$email  
'name@example.com';
$domain strstr($email'@');
echo 
$domain// @example.com と表示します

$user strstr($email'@'true); // PHP 5.3.0 以降
echo $user// name と表示します
?>

参考

  • stristr() - 大文字小文字を区別しない strstr
  • strrchr() - 文字列中に文字が最後に現れる場所を取得する
  • strpos() - 文字列内の部分文字列が最初に現れる場所を見つける
  • strpbrk() - 文字列の中から任意の文字を探す
  • preg_match() - 正規表現によるマッチングを行う

add a note add a note

User Contributed Notes 8 notes

up
21
gruessle at gmail dot com
5 years ago
Been using this for years:

<?php
/**
*
* @author : Dennis T Kaplan
*
* @version : 1.0
* Date : June 17, 2007
* Function : reverse strstr()
* Purpose : Returns part of haystack string from start to the first occurrence of needle
* $haystack = 'this/that/whatever';
* $result = rstrstr($haystack, '/')
* $result == this
*
* @access public
* @param string $haystack, string $needle
* @return string
**/

function rstrstr($haystack,$needle)
    {
        return
substr($haystack, 0,strpos($haystack, $needle));
    }
?>

You could change it to:
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php

function rstrstr($haystack,$needle, $start=0)
    {
        return
substr($haystack, $start,strpos($haystack, $needle));
    }

?>
up
17
laszlo dot heredy at gmail dot com
3 years ago
strstr() is not a way to avoid type-checking with strpos().

If $needle is the last character in $haystack, and testing $needle as a boolean by itself would evaluate to false, then testing strstr() as a boolean will evaluate to false (because, if successful, strstr() returns the first occurrence of $needle along with the rest of $haystack).

<?php
findZero
('01234');  // found a zero
findZero('43210');  // did not find a zero
findZero('0');      // did not find a zero
findZero('00');     // found a zero
findZero('000');    // found a zero
findZero('10');     // did not find a zero
findZero('100');    // found a zero

function findZero($numberString) {
    if (
strstr($numberString, '0')) {
        echo
'found a zero';
    } else {
        echo
'did not find a zero';
    }
}
?>

Also, strstr() is far more memory-intensive than strpos(), especially with longer strings as your $haystack, so if you are not interested in the substring that strstr() returns, you shouldn't be using it anyway.

There is no PHP function just to check only _if_ $needle occurs in $haystack; strpos() tells you if it _doesn't_ by returning false, but, if it does occur, it tells you _where_ it occurs as an integer, which is 0 (zero) if $needle is the first part of $haystack, which is why testing if (strpos($needle, $haystack)===false) is the only way to know for sure if $needle is not part of $haystack.

My advice is to start loving type checking immediately, and to familiarize yourself with the return value of the functions you are using.

Cheers.
up
9
brett dot jr dot alton at gmail dot com
9 years ago
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
?>
up
1
trent dot renshaw at objectst dot com dot au
1 year ago
> root at mantoru dot de

PHP makes this easy for you. When working with domain portion of email addresses, simply pass the return of strstr() to substr() and start at 1:

substr(strstr($haystack, '@'), 1);
up
5
w3b_monk3y at yahoo dot com
7 years ago
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.
up
3
xslidian at lidian dot info
3 years ago
For those in need of the last occurrence of a string:

<?php
function strrstr($h, $n, $before = false) {
   
$rpos = strrpos($h, $n);
    if(
$rpos === false) return false;
    if(
$before == false) return substr($h, $rpos);
    else return
substr($h, 0, $rpos);
}
?>
up
1
root at mantoru dot de
9 years ago
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
?>
up
-6
leo dot nard at free dot fr
11 years ago
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;
}
?>
To Top