• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • strstr()

    (PHP 4, PHP 5, PHP 7)

    查找字符串的首次出现

    说明

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

    返回$haystack字符串从$needle第一次出现的位置开始到$haystack结尾的字符串。

    Note:

    该函数区分大小写。如果想要不区分大小写,请使用stristr()。

    Note:

    如果你仅仅想确定$needle是否存在于$haystack中,请使用速度更快、耗费内存更少的strpos()函数。

    参数

    $haystack

    输入字符串。

    $needle

    如果$needle不是一个字符串,那么它将被转化为整型并且作为字符的序号来使用。

    $before_needle

    若为TRUEstrstr()将返回$needle$haystack中的位置之前的部分。

    返回值

    返回字符串的一部分或者FALSE(如果未发现$needle)。

    更新日志

    版本说明
    5.3.0新增可选的$before_needle参数。
    4.3.0strstr()成为二进制安全的。

    范例

    Example #1strstr()范例

    <?php
    $email  = 'name@example.com';
    $domain = strstr($email, '@');
    echo $domain; // 打印 @example.com
    $user = strstr($email, '@', true); // 从 PHP 5.3.0 起
    echo $user; // 打印 name
    ?>

    参见

    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.
    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));
      }
    ?>
    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.
    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
    ?>
    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);
    }
    ?>
    > 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);
    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
    ?>
    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;
    }
    ?>

    上篇:strspn()

    下篇:strtok()