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

    (PHP 5, PHP 7)

    查找字符串首次出现的位置(不区分大小写)

    说明

    stripos(string $haystack, string $needle[,int $offset= 0] ): int

    返回在字符串$haystack$needle首次出现的数字位置。

    与strpos()不同,stripos()不区分大小写。

    参数

    $haystack

    在该字符串中查找。

    $needle

    注意$needle可以是一个单字符或者多字符的字符串。

    如果$needle不是一个字符串,那么它将被转换为整型并被视为字符顺序值。

    $offset

    可选的$offset参数,从字符此数量的开始位置进行搜索。如果是负数,就从字符末尾此数量的字符数开始统计。

    返回值

    返回 needle 存在于$haystack字符串开始的位置(独立于偏移量)。同时注意字符串位置起始于 0,而不是 1。

    如果未发现 needle 将返回FALSE

    Warning

    此函数可能返回布尔值FALSE,但也可能返回等同于FALSE的非布尔值。请阅读布尔类型章节以获取更多信息。应使用===运算符来测试此函数的返回值。

    更新日志

    版本说明
    7.1.0开始支持负数的$offset

    范例

    Example #1stripos()范例

    <?php
    $findme    = 'a';
    $mystring1 = 'xyz';
    $mystring2 = 'ABC';
    $pos1 = stripos($mystring1, $findme);
    $pos2 = stripos($mystring2, $findme);
    // 'a' 当然不在 'xyz' 中
    if ($pos1 === false) {
        echo "The string '$findme' was not found in the string '$mystring1'";
    }
    // 注意这里使用的是 ===。简单的 == 不能像我们期望的那样工作,
    // 因为 'a' 的位置是 0(第一个字符)。
    if ($pos2 !== false) {
        echo "We found '$findme' in '$mystring2' at position $pos2";
    }
    ?>

    注释

    Note:此函数可安全用于二进制对象。

    参见

    • mb_stripos()大小写不敏感地查找字符串在另一个字符串中首次出现的位置
    • strpos()查找字符串首次出现的位置
    • strrpos()计算指定字符串在目标字符串中最后一次出现的位置
    • strripos()计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
    • stristr()strstr 函数的忽略大小写版本
    • substr()返回字符串的子串
    • str_ireplace()str_replace 的忽略大小写版本
    I found myself needing to find the first position of multiple needles in one haystack. So I wrote this little function:
    <?php
    function multineedle_stripos($haystack, $needles, $offset=0) {
      foreach($needles as $needle) {
        $found[$needle] = stripos($haystack, $needle, $offset);
      }
      return $found;
    }
    // It works as such:
    $haystack = "The quick brown fox jumps over the lazy dog.";
    $needle = array("fox", "dog", ".", "duck")
    var_dump(multineedle_stripos($haystack, $needle));
    /* Output:
      array(3) {
       ["fox"]=>
       int(16)
       ["dog"]=>
       int(40)
       ["."]=>
       int(43)
       ["duck"]=>
       bool(false)
      }
    */
    ?>
    Regarding the function by spam at wikicms dot org
    It is very bad practice to use the same function name as an existing php function but have a different output format. Someone maintaining the code in the future is likely to be very confused by this. It will also be hard to eradicate from a codebase because the naming is identical so each use of stripos() would have to be analyzed to see how it is expecting the output format (bool or number/bool).
    Calling it string_found() or something like that would make a lot more sense for long-term use.
    Unlike strpos() it seems that stripos() does NOT issue a WARNING if the needle is an empty string ''.
    Regarding the === note, it might be worth clarifying that the correct tests for a binary found/not found condition are !==false to detect found, and ===false to detect not found.
    Finding numbers in strings requires you to cast the number to string first.
    strpos("123", 2) !== strpos("123", "2")
    A handy function if you need to adjust layout based on whether or not a string contains descending letters:
    <?php function containsDescenders($text) {
      $descenders = array("g","j","p","q","y");
      foreach ($descenders as $letter) {
        if (stripos($text,$letter) !== false) {
          return true;
        }
      }
      return false;
    } ?>
    this would to work with any language, i hope.
    tested on czech (eastern europe) lang.
    <?php
    /****************************************
    *  SAFE HIGHLIGHT
    ****************************************/
    /**
     * function finds and encase every string in a $needleArr array with
     * strings $shearLft (from the left side) and $shearRgt (guess from which
     * side).
     * already encased needles are IGNORED for any other step, so order
     * of needles in $needleArr is pretty important.
     * 
     * function is searching needles in case-insensitive mode,
     * but case in the subject is saved.
     * 
     * can you do it better? so, do it.
     *
     * @param array $needleArr array of needles
     * @param string $shearLft left shear
     * @param string $shearRgt right shear
     * @param string $subject subject
     * @param string $encoding encoding ('utf-8' is default)
     * 
     * @author griffin
     */
    function safeHighlight( $needleArr, $shearLft, $shearRgt, $subject, $encoding = 'utf-8')
    {
      
      // encoding
      $e = $encoding;
      
      // oh, no needles
      if( !is_array( $needleArr))
        return $subject;
        
      // empty keys throw-off, only unique, reindex
      $nA = array_values(
          array_unique(
            array_diff( $needleArr, array(''))
          )
        );
      
      // needle count
      if( !($nC = count( $nA)))
        return $subject; // nothing to hl
        
      // shear length
      if( !(($rLL = mb_strlen( $rL = $shearLft, $e))
      + ($rRL = mb_strlen( $rR = $shearRgt, $e))))
        return $subject; // no shears
      
      // subject length
      if( !($sL = mb_strlen( $s = $subject, $e)))
        return null; // empty subject
        
      // subject in lowercase (we need to aviod
      // using mb_stripos due to PHP version)
      $sW = mb_strtolower( $s, $e);
      
      // masking ~ 0=not changed, 1=changed
      $m = str_repeat( '0', $sL);
      
      // loop for each needle
      for( $n=0; $n<$nC; $n++)
      {
        
        // needle string loWercase
        $nW = mb_strtolower( $nA[ $n], $e);
        
        $o = 0; // offset
        $nL = mb_strlen( $nW, $e); // needle length
        // search needle
        while( false !== ($p = mb_strpos( $sW, $nW, $o, $e)))
        {
          // oh hurrey, needle found on $p position
          
          // is founded needle already modified? (in full-length)
          for( $q=$p; $q<($p+$nL); $q++)
            if( $m[ $q])
            {
              // ai, caramba. already modified, jump over
              $o+= $nL;
              
              // continue for while() loop - not for for() loop!
              continue 2;
            }
          
          // explode subject and mask into three parts
          // partA | needle | partB
          $sE[0] = mb_substr( $s, 0, $p, $e);
          $sE[1] = mb_substr( $s, $p, $nL, $e);
          $sE[2] = mb_substr( $s, $p+$nL, $sL-$p-$nL, $e);
          
          // mask
          // partA | partB (needle not needed)
          $mE[0] = mb_substr( $m, 0, $p, $e);
          $mE[1] = mb_substr( $m, $p+$nL, $sL-$p-$nL, $e);
          
          // apply shears
          $sE[1] = $rL.$sE[1].$rR;
          
          // update sunject length
          $sL+= $rLL + $rRL;
          
          // update mask
          $m = $mE[0] . str_repeat( '1', $rLL + $nL + $rRL) . $mE[1];
          
          // implode into a subject
          $s = implode( $sE);
          
          // update lowercase subject
          $sW = mb_strtolower( $s, $e);
          
          // increase offset
          $o+= $rLL + $nL + $rRL;
          
          // end of string reached
          if( $o>=$sL)
            break;
          
        } // while()
        
      } // for( $n=0; $n<$nC; $n++)
      
      // oouu yeaaa, kick the subject out of the function
      return $s;
      
    } // function safeHighlight()
    /****************************************
    *  END: SAFE HIGHLIGHT
    ****************************************/
    ?>
    If you like using ternary operator, I wrote simple example how to use stripos function.
    Also, in my example I add "How to use namespaces" for wide knowledges for newbies.
    <?php
    namespace My;
    //You can be free using core functions in your NameSpaces (My)
    function stripos($haystack, $needle) {
      //To call core function (from global NS) you should add backslash only - \func
      return (FALSE === \stripos($haystack, $needle)) ? FALSE : TRUE;
    }
    var_dump(stripos($haystack = 'John knows English language.', $needle = 'john')); //TRUE
    var_dump(stripos($haystack = 'Sara knows English language too.', $needle = 'john')); //FALSE
    ?>

    上篇:stripcslashes()

    下篇:stripslashes()