Php как найти нужное слово

(PHP 4, PHP 5, PHP 7, PHP 8)

strposFind the position of the first occurrence of a substring in a string

Description

strpos(string $haystack, string $needle, int $offset = 0): int|false

Parameters

haystack

The string to search in.

needle

Prior to PHP 8.0.0, if needle is not a string, it is converted
to an integer and applied as the ordinal value of a character.
This behavior is deprecated as of PHP 7.3.0, and relying on it is highly
discouraged. Depending on the intended behavior, the
needle should either be explicitly cast to string,
or an explicit call to chr() should be performed.

offset

If specified, search will start this number of characters counted from
the beginning of the string. If the offset is negative, the search will start
this number of characters counted from the end of the string.

Return Values

Returns the position of where the needle exists relative to the beginning of
the haystack string (independent of offset).
Also note that string positions start at 0, and not 1.

Returns false if the needle was not found.

Warning

This function may
return Boolean false, but may also return a non-Boolean value which
evaluates to false. Please read the section on Booleans for more
information. Use the ===
operator for testing the return value of this
function.

Changelog

Version Description
8.0.0 Passing an int as needle is no longer supported.
7.3.0 Passing an int as needle has been deprecated.
7.1.0 Support for negative offsets has been added.

Examples

Example #1 Using ===


<?php
$mystring
= 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);// Note our use of ===. Simply == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo
"The string '$findme' was not found in the string '$mystring'";
} else {
echo
"The string '$findme' was found in the string '$mystring'";
echo
" and exists at position $pos";
}
?>

Example #2 Using !==


<?php
$mystring
= 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);// The !== operator can also be used. Using != would not work as expected
// because the position of 'a' is 0. The statement (0 != false) evaluates
// to false.
if ($pos !== false) {
echo
"The string '$findme' was found in the string '$mystring'";
echo
" and exists at position $pos";
} else {
echo
"The string '$findme' was not found in the string '$mystring'";
}
?>

Example #3 Using an offset


<?php
// We can search for the character, ignoring anything before the offset
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, not 0
?>

Notes

Note: This function is
binary-safe.

See Also

  • stripos() – Find the position of the first occurrence of a case-insensitive substring in a string
  • str_contains() – Determine if a string contains a given substring
  • str_ends_with() – Checks if a string ends with a given substring
  • str_starts_with() – Checks if a string starts with a given substring
  • strrpos() – Find the position of the last occurrence of a substring in a string
  • strripos() – Find the position of the last occurrence of a case-insensitive substring in a string
  • strstr() – Find the first occurrence of a string
  • strpbrk() – Search a string for any of a set of characters
  • substr() – Return part of a string
  • preg_match() – Perform a regular expression match

Suggested re-write for pink WARNING box

15 years ago


WARNING

As strpos may return either FALSE (substring absent) or 0 (substring at start of string), strict versus loose equivalency operators must be used very carefully.

To know that a substring is absent, you must use: 

=== FALSE

To know that a substring is present (in any position including 0), you can use either of:

!== FALSE  (recommended)
> -1  (note: or greater than any negative number)

To know that a substring is at the start of the string, you must use: 

=== 0

To know that a substring is in any position other than the start, you can use any of:

> 0  (recommended)
!= 0  (note: but not !== 0 which also equates to FALSE)
!= FALSE  (disrecommended as highly confusing)

Also note that you cannot compare a value of "" to the returned value of strpos. With a loose equivalence operator (== or !=) it will return results which don't distinguish between the substring's presence versus position. With a strict equivalence operator (=== or !==) it will always return false.


martijn at martijnfrazer dot nl

11 years ago


This is a function I wrote to find all occurrences of a string, using strpos recursively.

<?php
function strpos_recursive($haystack, $needle, $offset = 0, &$results = array()) {               
   
$offset = strpos($haystack, $needle, $offset);
    if(
$offset === false) {
        return
$results;           
    } else {
       
$results[] = $offset;
        return
strpos_recursive($haystack, $needle, ($offset + 1), $results);
    }
}
?>

This is how you use it:

<?php
$string
= 'This is some string';
$search = 'a';
$found = strpos_recursive($string, $search);

if(

$found) {
    foreach(
$found as $pos) {
        echo
'Found "'.$search.'" in string "'.$string.'" at position <b>'.$pos.'</b><br />';
    }   
} else {
    echo
'"'.$search.'" not found in "'.$string.'"';
}
?>


fabio at naoimporta dot com

7 years ago


It is interesting to be aware of the behavior when the treatment of strings with characters using different encodings.

<?php
# Works like expected. There is no accent
var_dump(strpos("Fabio", 'b'));
#int(2)

# The "á" letter is occupying two positions

var_dump(strpos("Fábio", 'b')) ;
#int(3)

# Now, encoding the string "Fábio" to utf8, we get some "unexpected" outputs. Every letter that is no in regular ASCII table, will use 4 positions(bytes). The starting point remains like before.
# We cant find the characted, because the haystack string is now encoded.

var_dump(strpos(utf8_encode("Fábio"), 'á'));
#bool(false)

# To get the expected result, we need to encode the needle too

var_dump(strpos(utf8_encode("Fábio"), utf8_encode('á')));
#int(1)

# And, like said before, "á" occupies 4 positions(bytes)

var_dump(strpos(utf8_encode("Fábio"), 'b'));
#int(5)


mtroy dot student at gmail dot com

11 years ago


when you want to know how much of substring occurrences, you'll use "substr_count".
But, retrieve their positions, will be harder.
So, you can do it by starting with the last occurrence :

function strpos_r($haystack, $needle)
{
    if(strlen($needle) > strlen($haystack))
        trigger_error(sprintf("%s: length of argument 2 must be <= argument 1", __FUNCTION__), E_USER_WARNING);

    $seeks = array();
    while($seek = strrpos($haystack, $needle))
    {
        array_push($seeks, $seek);
        $haystack = substr($haystack, 0, $seek);
    }
    return $seeks;
}

it will return an array of all occurrences a the substring in the string

Example :

$test = "this is a test for testing a test function... blah blah";
var_dump(strpos_r($test, "test"));

// output

array(3) {
  [0]=>
  int(29)
  [1]=>
  int(19)
  [2]=>
  int(10)
}

Paul-antoine
Malézieux.


rjeggens at ijskoud dot org

11 years ago


I lost an hour before I noticed that strpos only returns FALSE as a boolean, never TRUE.. This means that

strpos() !== false

is a different beast then:

strpos() === true

since the latter will never be true. After I found out, The warning in the documentation made a lot more sense.


m.m.j.kronenburg

6 years ago


<?php/**
* Find the position of the first occurrence of one or more substrings in a
* string.
*
* This function is simulair to function strpos() except that it allows to
* search for multiple needles at once.
*
* @param string $haystack    The string to search in.
* @param mixed $needles      Array containing needles or string containing
*                            needle.
* @param integer $offset     If specified, search will start this number of
*                            characters counted from the beginning of the
*                            string.
* @param boolean $last       If TRUE then the farthest position from the start
*                            of one of the needles is returned.
*                            If FALSE then the smallest position from start of
*                            one of the needles is returned.
**/
function mstrpos($haystack, $needles, $offset = 0, $last = false)
{
  if(!
is_array($needles)) { $needles = array($needles); }
 
$found = false;
  foreach(
$needles as $needle)
  {
   
$position = strpos($haystack, (string)$needle, $offset);
    if(
$position === false) { continue; }
   
$exp = $last ? ($found === false || $position > $found) :
      (
$found === false || $position < $found);
    if(
$exp) { $found = $position; }
  }
  return
$found;
}
/**
* Find the position of the first (partially) occurrence of a substring in a
* string.
*
* This function is simulair to function strpos() except that it wil return a
* position when the substring is partially located at the end of the string.
*
* @param string $haystack    The string to search in.
* @param mixed $needle       The needle to search for.
* @param integer $offset     If specified, search will start this number of
*                            characters counted from the beginning of the
*                            string.
**/
function pstrpos($haystack, $needle, $offset = 0)
{
 
$position = strpos($haystack, $needle, $offset);
  if(
$position !== false) { return $position; }

    for(

$i = strlen($needle); $i > 0; $i--)
  {
    if(
substr($needle, 0, $i) == substr($haystack, -$i))
    { return
strlen($haystack) - $i; }
  }
  return
false;
}
/**
* Find the position of the first (partially) occurrence of one or more
* substrings in a string.
*
* This function is simulair to function strpos() except that it allows to
* search for multiple needles at once and it wil return a position when one of
* the substrings is partially located at the end of the string.
*
* @param string $haystack    The string to search in.
* @param mixed $needles      Array containing needles or string containing
*                            needle.
* @param integer $offset     If specified, search will start this number of
*                            characters counted from the beginning of the
*                            string.
* @param boolean $last       If TRUE then the farthest position from the start
*                            of one of the needles is returned.
*                            If FALSE then the smallest position from start of
*                            one of the needles is returned.
**/
function mpstrpos($haystack, $needles, $offset = 0, $last = false)
{
  if(!
is_array($needles)) { $needles = array($needles); }
 
$found = false;
  foreach(
$needles as $needle)
  {
   
$position = pstrpos($haystack, (string)$needle, $offset);
    if(
$position === false) { continue; }
   
$exp = $last ? ($found === false || $position > $found) :
      (
$found === false || $position < $found);
    if(
$exp) { $found = $position; }
  }
  return
$found;
}
?>

jexy dot ru at gmail dot com

6 years ago


Docs are missing that WARNING is issued if needle is '' (empty string).

In case of empty haystack it just return false:

For example:

<?php
var_dump
(strpos('foo', ''));var_dump(strpos('', 'foo'));var_dump(strpos('', ''));
?>

will output:

Warning: strpos(): Empty needle in /in/lADCh on line 3
bool(false)

bool(false)

Warning: strpos(): Empty needle in /in/lADCh on line 7
bool(false)

Note also that warning text may differ depending on php version, see https://3v4l.org/lADCh


greg at spotx dot net

5 years ago


Warning:
this is not unicode safe

strpos($word,'?') in e?ez-> 1
strpos($word,'?') in è?ent-> 2


usulaco at gmail dot com

12 years ago


Parse strings between two others in to array.

<?php

function g($string,$start,$end){

    
preg_match_all('/' . preg_quote($start, '/') . '(.*?)'. preg_quote($end, '/').'/i', $string, $m);

    
$out = array();

     foreach(

$m[1] as $key => $value){

      
$type = explode('::',$value);

       if(
sizeof($type)>1){

          if(!
is_array($out[$type[0]]))

            
$out[$type[0]] = array();

         
$out[$type[0]][] = $type[1];

       } else {

         
$out[] = $value;

       }

     }

  return
$out;

}

print_r(g('Sample text, [/text to extract/] Rest of sample text [/WEB::http://google.com/] bla bla bla. ','[/','/]'));

?>



results:

Array

(

    [0] => text to extract

    [WEB] => Array

        (

            [0] => http://google.com

        )

)

Can be helpfull to custom parsing :)


akarmenia at gmail dot com

12 years ago


My version of strpos with needles as an array. Also allows for a string, or an array inside an array.

<?php
function strpos_array($haystack, $needles) {
    if (
is_array($needles) ) {
        foreach (
$needles as $str) {
            if (
is_array($str) ) {
               
$pos = strpos_array($haystack, $str);
            } else {
               
$pos = strpos($haystack, $str);
            }
            if (
$pos !== FALSE) {
                return
$pos;
            }
        }
    } else {
        return
strpos($haystack, $needles);
    }
}
// Test
echo strpos_array('This is a test', array('test', 'drive')); // Output is 10?>


eef dot vreeland at gmail dot com

6 years ago


To prevent others from staring at the text, note that the wording of the 'Return Values' section is ambiguous.

Let's say you have a string $myString containing 50 'a's except on position 3 and 43, they contain 'b'.
And for this moment, forget that counting starts from 0.

strpos($myString, 'b', 40) returns 43, great.

And now the text: "Returns the position of where the needle exists relative to the beginning of the haystack string (independent of offset)."

So it doesn't really matter what offset I specify; I'll get the REAL position of the first occurrence in return, which is 3?

... no ...

"independent of offset" means, you will get the REAL positions, thus, not relative to your starting point (offset).

Substract your offset from strpos()'s answer, then you have the position relative to YOUR offset.


ohcc at 163 dot com

8 years ago


Be careful when the $haystack or $needle parameter is an integer.
If you are not sure of its type, you should  convert it into a string.
<?php
    var_dump
(strpos(12345,1));//false
   
var_dump(strpos(12345,'1'));//0
   
var_dump(strpos('12345',1));//false
   
var_dump(strpos('12345','1'));//0
   
$a = 12345;
   
$b = 1;
   
var_dump(strpos(strval($a),strval($b)));//0
   
var_dump(strpos((string)$a,(string)$b));//0   
?>

ilaymyhat-rem0ve at yahoo dot com

15 years ago


This might be useful.

<?php

class String{
//Look for a $needle in $haystack in any position

   
public static function contains(&$haystack, &$needle, &$offset)

    {

       
$result = strpos($haystack, $needle, $offset);

        return
$result !== FALSE;

    }
//intuitive implementation .. if not found returns -1.

   
public static function strpos(&$haystack, &$needle, &$offset)

    {

       
$result = strpos($haystack, $needle, $offset);

        if (
$result === FALSE )

        {

            return -
1;

        }

        return
$result;

    }

   
}

//String

?>


yasindagli at gmail dot com

13 years ago


This function finds postion of nth occurence of a letter starting from offset.

<?php
function nth_position($str, $letter, $n, $offset = 0){
   
$str_arr = str_split($str);
   
$letter_size = array_count_values(str_split(substr($str, $offset)));
    if( !isset(
$letter_size[$letter])){
       
trigger_error('letter "' . $letter . '" does not exist in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
        return
false;
    } else if(
$letter_size[$letter] < $n) {
       
trigger_error('letter "' . $letter . '" does not exist ' . $n .' times in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
        return
false;
    }
    for(
$i = $offset, $x = 0, $count = (count($str_arr) - $offset); $i < $count, $x != $n; $i++){
        if(
$str_arr[$i] == $letter){
           
$x++;
        }
    }
    return
$i - 1;
}

echo

nth_position('foobarbaz', 'a', 2); //7
echo nth_position('foobarbaz', 'b', 1, 4); //6
?>


bishop

19 years ago


Code like this:
<?php
if (strpos('this is a test', 'is') !== false) {
    echo
"found it";
}
?>

gets repetitive, is not very self-explanatory, and most people handle it incorrectly anyway. Make your life easier:

<?php
function str_contains($haystack, $needle, $ignoreCase = false) {
    if (
$ignoreCase) {
       
$haystack = strtolower($haystack);
       
$needle   = strtolower($needle);
    }
   
$needlePos = strpos($haystack, $needle);
    return (
$needlePos === false ? false : ($needlePos+1));
}
?>

Then, you may do:
<?php
// simplest use
if (str_contains('this is a test', 'is')) {
    echo
"Found it";
}
// when you need the position, as well whether it's present
$needlePos = str_contains('this is a test', 'is');
if (
$needlePos) {
    echo
'Found it at position ' . ($needlePos-1);
}
// you may also ignore case
$needlePos = str_contains('this is a test', 'IS', true);
if (
$needlePos) {
    echo
'Found it at position ' . ($needlePos-1);
}
?>


Jean

4 years ago


When a value can be of "unknow" type, I find this conversion trick usefull and more readable than a formal casting (for php7.3+):

<?php
$time
= time();
$string = 'This is a test: ' . $time;
echo (
strpos($string, $time) !== false ? 'found' : 'not found');
echo (
strpos($string, "$time") !== false ? 'found' : 'not found');
?>


Anonymous

10 years ago


The most straightforward way to prevent this function from returning 0 is:

  strpos('x'.$haystack, $needle, 1)

The 'x' is simply a garbage character which is only there to move everything 1 position.
The number 1 is there to make sure that this 'x' is ignored in the search.
This way, if $haystack starts with $needle, then the function returns 1 (rather than 0).


marvin_elia at web dot de

5 years ago


Find position of nth occurrence of a string:

    function strpos_occurrence(string $string, string $needle, int $occurrence, int $offset = null) {
        if((0 < $occurrence) && ($length = strlen($needle))) {
            do {
            } while ((false !== $offset = strpos($string, $needle, $offset)) && --$occurrence && ($offset += $length));
            return $offset;
        }
        return false;
    }


digitalpbk [at] gmail.com

13 years ago


This function raises a warning if the offset is not between 0 and the length of string:

Warning: strpos(): Offset not contained in string in %s on line %d


Achintya

13 years ago


A function I made to find the first occurrence of a particular needle not enclosed in quotes(single or double). Works for simple nesting (no backslashed nesting allowed).

<?php

function strposq($haystack, $needle, $offset = 0){

   
$len = strlen($haystack);

   
$charlen = strlen($needle);

   
$flag1 = false;

   
$flag2 = false;

    for(
$i = $offset; $i < $len; $i++){

        if(
substr($haystack, $i, 1) == "'"){

           
$flag1 = !$flag1 && !$flag2 ? true : false;

        }

        if(
substr($haystack, $i, 1) == '"'){

           
$flag2 = !$flag1 && !$flag2 ? true : false;

        }

        if(
substr($haystack, $i, $charlen) == $needle && !$flag1 && !$flag2){

            return
$i;       

        }

    }

    return
false;

}

echo

strposq("he'llo'character;"'som"e;crap", ";"); //16

?>


spinicrus at gmail dot com

16 years ago


if you want to get the position of a substring relative to a substring of your string, BUT in REVERSE way:

<?phpfunction strpos_reverse_way($string,$charToFind,$relativeChar) {
   
//
   
$relativePos = strpos($string,$relativeChar);
   
$searchPos = $relativePos;
   
$searchChar = '';
   
//
   
while ($searchChar != $charToFind) {
       
$newPos = $searchPos-1;
       
$searchChar = substr($string,$newPos,strlen($charToFind));
       
$searchPos = $newPos;
    }
   
//
   
if (!empty($searchChar)) {
       
//
       
return $searchPos;
        return
TRUE;
    }
    else {
        return
FALSE;
    }
   
//
}?>


lairdshaw at yahoo dot com dot au

8 years ago


<?php
/*
* A strpos variant that accepts an array of $needles - or just a string,
* so that it can be used as a drop-in replacement for the standard strpos,
* and in which case it simply wraps around strpos and stripos so as not
* to reduce performance.
*
* The "m" in "strposm" indicates that it accepts *m*ultiple needles.
*
* Finds the earliest match of *all* needles. Returns the position of this match
* or false if none found, as does the standard strpos. Optionally also returns
* via $match either the matching needle as a string (by default) or the index
* into $needles of the matching needle (if the STRPOSM_MATCH_AS_INDEX flag is
* set).
*
* Case-insensitive searching can be specified via the STRPOSM_CI flag.
* Note that for case-insensitive searches, if the STRPOSM_MATCH_AS_INDEX is
* not set, then $match will be in the haystack's case, not the needle's case,
* unless the STRPOSM_NC flag is also set.
*
* Flags can be combined using the bitwise or operator,
* e.g. $flags = STRPOSM_CI|STRPOSM_NC
*/
define('STRPOSM_CI'            , 1); // CI => "case insensitive".
define('STRPOSM_NC'            , 2); // NC => "needle case".
define('STRPOSM_MATCH_AS_INDEX', 4);
function
strposm($haystack, $needles, $offset = 0, &$match = null, $flags = 0) {
   
// In the special case where $needles is not an array, simply wrap
    // strpos and stripos for performance reasons.
   
if (!is_array($needles)) {
       
$func = $flags & STRPOSM_CI ? 'stripos' : 'strpos';
       
$pos = $func($haystack, $needles, $offset);
        if (
$pos !== false) {
           
$match = (($flags & STRPOSM_MATCH_AS_INDEX)
                      ?
0
                     
: (($flags & STRPOSM_NC)
                         ?
$needles
                        
: substr($haystack, $pos, strlen($needles))
                        )
                      );
            return
$pos;
        } else    goto
strposm_no_match;
    }
// $needles is an array. Proceed appropriately, initially by...
    // ...escaping regular expression meta characters in the needles.
   
$needles_esc = array_map('preg_quote', $needles);
   
// If either of the "needle case" or "match as index" flags are set,
    // then create a sub-match for each escaped needle by enclosing it in
    // parentheses. We use these later to find the index of the matching
    // needle.
   
if (($flags & STRPOSM_NC) || ($flags & STRPOSM_MATCH_AS_INDEX)) {
       
$needles_esc = array_map(
            function(
$needle) {return '('.$needle.')';},
           
$needles_esc
       
);
    }
   
// Create the regular expression pattern to search for all needles.
   
$pattern = '('.implode('|', $needles_esc).')';
   
// If the "case insensitive" flag is set, then modify the regular
    // expression with "i", meaning that the match is "caseless".
   
if ($flags & STRPOSM_CI) $pattern .= 'i';
   
// Find the first match, including its offset.
   
if (preg_match($pattern, $haystack, $matches, PREG_OFFSET_CAPTURE, $offset)) {
       
// Pull the first entry, the overall match, out of the matches array.
       
$found = array_shift($matches);
       
// If we need the index of the matching needle, then...
       
if (($flags & STRPOSM_NC) || ($flags & STRPOSM_MATCH_AS_INDEX)) {
           
// ...find the index of the sub-match that is identical
            // to the overall match that we just pulled out.
            // Because sub-matches are in the same order as needles,
            // this is also the index into $needles of the matching
            // needle.
           
$index = array_search($found, $matches);
        }
       
// If the "match as index" flag is set, then return in $match
        // the matching needle's index, otherwise...
       
$match = (($flags & STRPOSM_MATCH_AS_INDEX)
          ?
$index
         
// ...if the "needle case" flag is set, then index into
          // $needles using the previously-determined index to return
          // in $match the matching needle in needle case, otherwise...
         
: (($flags & STRPOSM_NC)
             ?
$needles[$index]
            
// ...by default, return in $match the matching needle in
             // haystack case.
            
: $found[0]
          )
        );
       
// Return the captured offset.
       
return $found[1];
    }
strposm_no_match:
   
// Nothing matched. Set appropriate return values.
   
$match = ($flags & STRPOSM_MATCH_AS_INDEX) ? false : null;
    return
false;
}
?>

qrworld.net

8 years ago


I found a function in this post http://softontherocks.blogspot.com/2014/11/buscar-multiples-textos-en-un-texto-con.html
that implements the search in both ways, case sensitive or case insensitive, depending on an input parameter.

The function is:

function getMultiPos($haystack, $needles, $sensitive=true, $offset=0){
    foreach($needles as $needle) {
        $result[$needle] = ($sensitive) ? strpos($haystack, $needle, $offset) : stripos($haystack, $needle, $offset);
    }
    return $result;
}

It was very useful for me.


Lurvik

9 years ago


Don't know if already posted this, but if I did this is an improvement.

This function will check if a string contains  a needle. It _will_ work with arrays and multidimensional arrays (I've tried with a > 16 dimensional array and had no problem).

<?php
function str_contains($haystack, $needles)
{
   
//If needles is an array
   
if(is_array($needles))
    {
       
//go trough all the elements
       
foreach($needles as $needle)
        {
           
//if the needle is also an array (ie needles is a multidimensional array)
           
if(is_array($needle))
            {
               
//call this function again
               
if(str_contains($haystack, $needle))
                {
                   
//Will break out of loop and function.
                   
return true;
                }

                                return

false;
            }
//when the needle is NOT an array:
                //Check if haystack contains the needle, will ignore case and check for whole words only
           
elseif(preg_match("/b$needleb/i", $haystack) !== 0)
            {
                return
true;
            }
        }
    }
   
//if $needles is not an array...
   
else
    {
        if(
preg_match("/b$needlesb/i", $haystack) !== 0)
        {
            return
true;
        }
    }

    return

false;
}
?>


gambajaja at yahoo dot com

12 years ago


<?php
$my_array
= array ('100,101', '200,201', '300,301');
$check_me_in = array ('100','200','300','400');
foreach (
$check_me_in as $value_cmi){
   
$is_in=FALSE; #asume that $check_me_in isn't in $my_array
   
foreach ($my_array as $value_my){
       
$pos = strpos($value_my, $value_cmi);
        if (
$pos===0)
           
$pos++;
        if (
$pos==TRUE){
           
$is_in=TRUE;
           
$value_my2=$value_my;
            }
    }
    if (
$is_in) echo "ID $value_cmi in $check_me_in I found in value '$value_my2' n";
}
?>

The above example will output
ID 100 in $check_me_in I found in value '100,101'
ID 200 in $check_me_in I found in value '200,201'
ID 300 in $check_me_in I found in value '300,301'

ah dot d at hotmail dot com

13 years ago


A strpos modification to return an array of all the positions of a needle in the haystack

<?php

function strallpos($haystack,$needle,$offset = 0){

   
$result = array();

    for(
$i = $offset; $i<strlen($haystack); $i++){

       
$pos = strpos($haystack,$needle,$i);

        if(
$pos !== FALSE){

           
$offset $pos;

            if(
$offset >= $i){

               
$i = $offset;

               
$result[] = $offset;

            }

        }

    }

    return
$result;

}

?>



example:-

<?php

$haystack
= "ASD is trying to get out of the ASDs cube but the other ASDs told him that his behavior will destroy the ASDs world";
$needle = "ASD";
print_r(strallpos($haystack,$needle));
//getting all the positions starting from a specified position
print_r(strallpos($haystack,$needle,34));

?>


teddanzig at yahoo dot com

14 years ago


routine to return -1 if there is no match for strpos

<?php

//instr function to mimic vb instr fucntion

function InStr($haystack, $needle)

{

   
$pos=strpos($haystack, $needle);

    if (
$pos !== false)

    {

        return
$pos;

    }

    else

    {

        return -
1;

    }

}

?>


Tim

14 years ago


If you would like to find all occurences of a needle inside a haystack you could use this function strposall($haystack,$needle);. It will return an array with all the strpos's.

<?php

/**

* strposall

*

* Find all occurrences of a needle in a haystack

*

* @param string $haystack

* @param string $needle

* @return array or false

*/

function strposall($haystack,$needle){
$s=0;

   
$i=0;

   
    while (

is_integer($i)){
$i = strpos($haystack,$needle,$s);

       
        if (

is_integer($i)) {

           
$aStrPos[] = $i;

           
$s = $i+strlen($needle);

        }

    }

    if (isset(
$aStrPos)) {

        return
$aStrPos;

    }

    else {

        return
false;

    }

}

?>


user at nomail dot com

16 years ago


This is a bit more useful when scanning a large string for all occurances between 'tags'.

<?php
function getStrsBetween($s,$s1,$s2=false,$offset=0) {
   
/*====================================================================
    Function to scan a string for items encapsulated within a pair of tags

    getStrsBetween(string, tag1, <tag2>, <offset>

    If no second tag is specified, then match between identical tags

    Returns an array indexed with the encapsulated text, which is in turn
    a sub-array, containing the position of each item.

    Notes:
    strpos($needle,$haystack,$offset)
    substr($string,$start,$length)

    ====================================================================*/

if( $s2 === false ) { $s2 = $s1; }
   
$result = array();
   
$L1 = strlen($s1);
   
$L2 = strlen($s2);

    if(

$L1==0 || $L2==0 ) {
        return
false;
    }

    do {

$pos1 = strpos($s,$s1,$offset);

        if(

$pos1 !== false ) {
           
$pos1 += $L1;$pos2 = strpos($s,$s2,$pos1);

            if(

$pos2 !== false ) {
               
$key_len = $pos2 - $pos1;$this_key = substr($s,$pos1,$key_len);

                if( !

array_key_exists($this_key,$result) ) {
                   
$result[$this_key] = array();
                }
$result[$this_key][] = $pos1;$offset = $pos2 + $L2;
            } else {
               
$pos1 = false;
            }
        }
    } while(
$pos1 !== false );

    return

$result;
}
?>


philip

18 years ago


Many people look for in_string which does not exist in PHP, so, here's the most efficient form of in_string() (that works in both PHP 4/5) that I can think of:

<?php

function in_string($needle, $haystack, $insensitive = false) {

    if (
$insensitive) {

        return
false !== stristr($haystack, $needle);

    } else {

        return
false !== strpos($haystack, $needle);

    }

}

?>

Lhenry

5 years ago


note that strpos( "8 june 1970"  ,  1970 ) returns FALSE..

add quotes to the needle


gjh42 – simonokewode at hotmail dot com

11 years ago


A pair of functions to replace every nth occurrence of a string with another string, starting at any position in the haystack. The first works on a string and the second works on a single-level array of strings, treating it as a single string for replacement purposes (any needles split over two array elements are ignored).

Can be used for formatting dynamically-generated HTML output without touching the original generator: e.g. add a newLine class tag to every third item in a floated list, starting with the fourth item.

<?php
/* String Replace at Intervals   by Glenn Herbert (gjh42)    2010-12-17
*/

//(basic locator by someone else - name unknown)
//strnposr() - Find the position of nth needle in haystack.

function strnposr($haystack, $needle, $occurrence, $pos = 0) {
    return (
$occurrence<2)?strpos($haystack, $needle, $pos):strnposr($haystack,$needle,$occurrence-1,strpos($haystack, $needle, $pos) + 1);
}
//gjh42
//replace every nth occurrence of $needle with $repl, starting from any position
function str_replace_int($needle, $repl, $haystack, $interval, $first=1, $pos=0) {
  if (
$pos >= strlen($haystack) or substr_count($haystack, $needle, $pos) < $first) return $haystack;
 
$firstpos = strnposr($haystack, $needle, $first, $pos);
 
$nl = strlen($needle);
 
$qty = floor(substr_count($haystack, $needle, $firstpos + 1)/$interval);
  do {
//in reverse order
   
$nextpos = strnposr($haystack, $needle, ($qty * $interval) + 1, $firstpos);
   
$qty--;
   
$haystack = substr_replace($haystack, $repl, $nextpos, $nl);
  } while (
$nextpos > $firstpos);
  return
$haystack;
}
 
//$needle = string to find
  //$repl = string to replace needle
  //$haystack = string to do replacing in
  //$interval = number of needles in loop
  //$first=1 = first occurrence of needle to replace (defaults to first)
  //$pos=0 = position in haystack string to start from (defaults to first)

//replace every nth occurrence of $needle with $repl, starting from any position, in a single-level array

function arr_replace_int($needle, $repl, $arr, $interval, $first=1, $pos=0, $glue='|+|') {
  if (!
is_array($arr))  return $arr;
  foreach(
$arr as $key=>$value){
    if (
is_array($arr[$key])) return $arr;
  }
 
$haystack = implode($glue, $arr);
 
$haystack = str_replace_int($needle, $repl, $haystack, $interval, $first, $pos);
 
$tarr = explode($glue, $haystack);
 
$i = 0;
  foreach(
$arr as $key=>$value){
   
$arr[$key] = $tarr[$i];
   
$i++;
  }
  return
$arr;
}
?>
If $arr is not an array, or a multilevel array, it is returned unchanged.


amolocaleb at gmail dot com

4 years ago


Note that strpos() is case sensitive,so when doing a case insensitive search,use stripos() instead..If the latter is not available,subject the string to strlower() first,otherwise you may end up in this situation..
<?php
//say we are matching url routes and calling access control middleware depending on the route$registered_route = '/admin' ;
//now suppose we want to call the authorization middleware before accessing the admin route
if(strpos($path->url(),$registered_route) === 0){
    
$middleware->call('Auth','login');
}
?>
and the auth middleware is as follows
<?php
class Auth{

function

login(){
   if(!
loggedIn()){
       return
redirect("path/to/login.php");
}
return
true;
}
}
//Now suppose:
$user_url = '/admin';
//this will go to the Auth middleware for checks and redirect accordingly

//But:

$user_url = '/Admin';
//this will make the strpos function return false since the 'A' in admin is upper case and user will be taken directly to admin dashboard authentication and authorization notwithstanding
?>
Simple fixes:
<?php
//use stripos() as from php 5
if(stripos($path->url(),$registered_route) === 0){
    
$middleware->call('Auth','login');
}
//for those with php 4
if(stripos(strtolower($path->url()),$registered_route) === 0){
    
$middleware->call('Auth','login');
}
//make sure the $registered_route is also lowercase.Or JUST UPGRADE to PHP 5>

ds at kala-it dot de

3 years ago


Note this code example below in PHP 7.3
<?php
$str
= "17,25";

if(

FALSE !== strpos($str, 25)){
    echo
"25 is inside of str";
} else {
    echo
"25 is NOT inside of str";
}
?>

Will output "25 is NOT inside of str" and will throw out a deprication message, that non string needles will be interpreted as strings in the future.

This just gave me some headache since the value I am checking against comes from the database as an integer.


sunmacet at gmail dot com

2 years ago


To check that a substring is present.

Confusing check if position is not false:

if ( strpos ( $haystack , $needle ) !== FALSE )

Logical check if there is position:

if ( is_int ( strpos ( $haystack , $needle ) ) )


binodluitel at hotmail dot com

9 years ago


This function will return 0 if the string that you are searching matches i.e. needle matches the haystack

{code}
echo strpos('bla', 'bla');
{code}

Output: 0


hu60 dot cn at gmail dot com

3 years ago


A more accurate imitation of the PHP function session_start().

Function my_session_start() does something similar to session_start() that has the default configure, and the session files generated by the two are binary compatible.

The code may help people increase their understanding of the principles of the PHP session.

<?php
error_reporting
(E_ALL);
ini_set('display_errors', true);
ini_set('session.save_path', __DIR__);my_session_start();

echo

'<p>session id: '.my_session_id().'</p>';

echo

'<code><pre>';
var_dump($_SESSION);
echo
'</pre></code>';$now = date('H:i:s');
if (isset(
$_SESSION['last_visit_time'])) {
  echo
'<p>Last Visit Time: '.$_SESSION['last_visit_time'].'</p>';
}
echo
'<p>Current Time: '.$now.'</p>';$_SESSION['last_visit_time'] = $now;

function

my_session_start() {
  global
$phpsessid, $sessfile;

  if (!isset(

$_COOKIE['PHPSESSID']) || empty($_COOKIE['PHPSESSID'])) {
   
$phpsessid = my_base32_encode(my_random_bytes(16));
   
setcookie('PHPSESSID', $phpsessid, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
  } else {
   
$phpsessid = substr(preg_replace('/[^a-z0-9]/', '', $_COOKIE['PHPSESSID']), 0, 26);
  }
$sessfile = ini_get('session.save_path').'/sess_'.$phpsessid;
  if (
is_file($sessfile)) {
   
$_SESSION = my_unserialize(file_get_contents($sessfile));
  } else {
   
$_SESSION = array();
  }
 
register_shutdown_function('my_session_save');
}

function

my_session_save() {
  global
$sessfile;file_put_contents($sessfile, my_serialize($_SESSION));
}

function

my_session_id() {
  global
$phpsessid;
  return
$phpsessid;
}

function

my_serialize($data) {
 
$text = '';
  foreach (
$data as $k=>$v) {
   
// key cannot contains '|'
   
if (strpos($k, '|') !== false) {
      continue;
    }
   
$text.=$k.'|'.serialize($v)."n";
  }
  return
$text;
}

function

my_unserialize($text) {
 
$data = [];
 
$text = explode("n", $text);
  foreach (
$text as $line) {
   
$pos = strpos($line, '|');
    if (
$pos === false) {
      continue;
    }
   
$data[substr($line, 0, $pos)] = unserialize(substr($line, $pos + 1));
  }
  return
$data;
}

function

my_random_bytes($length) {
  if (
function_exists('random_bytes')) {
      return
random_bytes($length);
  }
 
$randomString = '';
  for (
$i = 0; $i < $length; $i++) {
     
$randomString .= chr(rand(0, 255));
  }
  return
$randomString;
}

function

my_base32_encode($input) {
 
$BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
 
$output = '';
 
$v = 0;
 
$vbits = 0;
  for (
$i = 0, $j = strlen($input); $i < $j; $i++) {
   
$v <<= 8;
   
$v += ord($input[$i]);
   
$vbits += 8;
    while (
$vbits >= 5) {
     
$vbits -= 5;
     
$output .= $BASE32_ALPHABET[$v >> $vbits];
     
$v &= ((1 << $vbits) - 1);
    }
  }
  if (
$vbits > 0) {
   
$v <<= (5 - $vbits);
   
$output .= $BASE32_ALPHABET[$v];
  }
  return
$output;
}


msegit post pl

4 years ago


This might be useful, I often use for parsing file paths etc.
(Some examples inside https://gist.github.com/msegu/bf7160257037ec3e301e7e9c8b05b00a )
<?php
/**
* Function 'strpos_' finds the position of the first or last occurrence of a substring in a string, ignoring number of characters
*
* Function 'strpos_' is similar to 'str[r]pos()', except:
* 1. fourth (last, optional) param tells, what to return if str[r]pos()===false
* 2. third (optional) param $offset tells as of str[r]pos(), BUT if negative (<0) search starts -$offset characters counted from the end AND skips (ignore!, not as 'strpos' and 'strrpos') -$offset-1 characters from the end AND search backwards
*
* @param string $haystack Where to search
* @param string $needle What to find
* @param int $offset (optional) Number of characters to skip from the beginning (if 0, >0) or from the end (if <0) of $haystack
* @param mixed $resultIfFalse (optional) Result, if not found
*    Example:
*    positive $offset - like strpos:
*        strpos_('abcaba','ab',1)==strpos('abcaba','ab',1)==3, strpos('abcaba','ab',4)===false, strpos_('abcaba','ab',4,'Not found')==='Not found'
*    negative $offset - similar to strrpos:
*        strpos_('abcaba','ab',-1)==strpos('abcaba','ab',-1)==3, strrpos('abcaba','ab',-3)==3 BUT strpos_('abcaba','ab',-3)===0 (omits 2 characters from the end, because -2-1=-3, means search in 'abca'!)
*
* @result int $offset Returns offset (or false), or $resultIfFalse
*/
function strpos_($haystack, $needle, $offset = 0, $resultIfFalse = false) {
   
$haystack=((string)$haystack);    // (string) to avoid errors with int, float...
   
$needle=((string)$needle);
    if (
$offset>=0) {
       
$offset=strpos($haystack, $needle, $offset);
        return ((
$offset===false)? $resultIfFalse : $offset);
    } else {
       
$haystack=strrev($haystack);
       
$needle=strrev($needle);
       
$offset=strpos($haystack,$needle,-$offset-1);
        return ((
$offset===false)? $resultIfFalse : strlen($haystack)-$offset-strlen($needle));
    }
}
?>

Добрый День, у меня вопрос:

Есть строка например:

abracadabra-cudsa_123-qwerty-text_a-abraca-trollololo-nlo

Если в строке есть слово(маркер) = text_a то вывести: Привет Васа!

Если в строке есть слово(маркер) = text_b то вывести: Привет Лана!

Если в строке не найдено text_a или text_b то вывести дефолт: Привет Мир!

Я делаю так:

$text = $_GET['text'];

$main_str = $text;

//искомый текст
$my_str = 'text_a';

$pos = strpos($main_str, $my_str);
if ($pos === false) {
  echo 'Привет Мир!';
}else{
  echo 'Привет Васа!';
}

Но тут проблема что ищет только одно слово (маркер)
Помогите решить! Спасибо!

Василий Барбашев's user avatar

задан 25 мар 2016 в 7:38

John Freeman's user avatar

John FreemanJohn Freeman

1391 золотой знак2 серебряных знака11 бронзовых знаков

Как вариант:

$text = $_GET['text'];

$main_str = $text;

if (strpos($main_str, 'text_a') !== false) {
  echo 'Привет Васа!';
} elseif (strpos($main_str, 'text_b') !== false) {
  echo 'Привет Лана!';
} else {
  echo 'Привет Мир!';
}

P.S. А что нужно делать, если найдены оба?

ответ дан 25 мар 2016 в 7:44

user200141's user avatar

user200141user200141

1,0071 золотой знак6 серебряных знаков17 бронзовых знаков

0

$text = $_GET['text'];

$main_str = $text;

$has_a = strpos($main_str, 'text_a') !== false;
$has_b = strpos($main_str, 'text_b') !== false;

if ($has_a && $has_b) {
    echo 'ОШИБКА';
} else {
    if ($has_a) {
        echo 'А';
    } elseif ($has_b) {
        echo 'Б';
    } else {
        echo 'ПУСТО';
    }
}

ответ дан 25 мар 2016 в 8:25

u_mulder's user avatar

u_mulderu_mulder

3,5843 золотых знака17 серебряных знаков23 бронзовых знака

раз уж стоит метка регулярные-выражения

<?php

$main_str = 'abracadabra-cudsa_123-qwerty-text_a-abraca-trollololo-nlo';

//искомый текст
$my_str = '/text_a|text_b/';

$matches = array();
preg_match_all($my_str, $main_str, $matches);

if (array_search('text_a', $matches[0]) !== false)
  echo 'Привет, Васа!';
elseif(array_search('text_b', $matches[0]) !== false)
  echo 'Привет, Лана!';
else
  echo 'Привет, Мир!';

ответ дан 25 мар 2016 в 8:07

Nikola Tesla's user avatar

9

В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода.

  • Поиск символа в строке – использование strpos() для регистрозависимого поиска
  • Поиск символа в строке – использование функции stripos() для регистронезависимого поиска
  • Поиск символа в строке – использование регулярных выражений
  • Использование регулярных выражений для поиска точного вхождения слова
  • Использование strstr() для поиска подстроки

Простейшим способом проверить, содержит ли строка определённое слово, является использование PHP функции strpos(). Она возвращает позицию первого вхождения подстроки в строке или FALSE, если соответствия не найдены. Поэтому можно сравнить значение, возвращаемое функцией strpos() с FALSE, чтобы проверить наличие подстроки. Пример:

$the_string = "Я на 5 лет старше тебя.";
$the_word = "лет";
$the_character = "Я";
$the_substring = "5 лет";

// Вывод — Слово "лет" есть в данной строке.
if (strpos($the_string, $the_word) !== false) {
  echo 'Слово "'.$the_word.'" есть в данной строке.';
}

// Вывод — Символ "Я" есть в данной строке.
if (strpos($the_string, $the_character) !== false) {
  echo ' Символ "'.$the_character.'" есть в данной строке.';
}

// Вывод — Подстрока "5 лет" есть в данной строке.
if (strpos($the_string, $the_substring) !== false) {
  echo 'Подстрока "'.$the_substring.'" есть в данной строке.';
}

Обратите внимание, что я использовал оператор строгого неравенства (!==). Если искомое слово встречается в начале строки, функция strpos() вернёт 0. Это будет расценено оператором != как значение FALSE. Пример:

// Вывод — Символа "Я" нет в данной строке.
if (strpos($the_string, $the_character) != false) {
  echo 'Символ "'.$the_character.'" есть в данной строке.';
} else {
  echo 'Символа "'.$the_character.'" нет в данной строке.';
}

При поиске целого слова (например, “на”) функция также вернёт значение TRUE, если строка содержит такие слова, как “она”, “вена” или “например”.

Также можно использовать > -1 вместо !==. Потому что даже если strpos() вернёт 0 как значение индекса, он всё равно будет больше -1. Но помните, что оператор «больше» (>) работает медленнее оператора строгого неравенства (!==).

Для регистрозависимого поиска можно использовать функцию stripos(). Она работает аналогично функции strpos(). Единственное отличие заключается в том, что она игнорирует регистр при поиске подстроки внутри другой строки.

$the_string = "Ваня любит и яблоки, и апельсины.";
$the_word  = "ваня";
$the_character = "Я";
$the_substring = "ЛЮбИт И";

// Вывод — Слово "ваня" есть в данной строке.
if (stripos($the_string, $the_word) !== false) {
  echo 'Слово "'.$the_word.'" есть в данной строке.';
}

// Вывод — Символ "Я" есть в данной строке.
if (stripos($the_string, $the_character) !== false) {
  echo 'Символ "'.$the_character.'" есть в данной строке.';
}

// Вывод — Подстрока "ЛЮбИт И" есть в данной строке.
if (stripos($the_string, $the_substring) !== false) {
  echo 'Подстрока "'.$the_substring.'" есть в данной строке.';
}

Функция strpos() вернула бы значение FALSE во всех перечисленных выше случаях. Но функция stripos() проигнорировала регистр и вернула значение TRUE.

Другим способом поиска, независящим от регистра, является преобразование всех строк и подстрок в одинаковый регистр, используя функции strtolower() и strtoupper(). Для проверки можно использовать strpos(). Но проще stripos().

Также для поиска можно использовать регулярные выражения. Они лучше подходят для случаев, когда вы ищете в строке более сложные конструкции.

Но помните, что функция strpos() работает в три раза быстрее, чем регулярные выражения. Следующий пример демонстрирует, как с их помощью найти слово, символ в строке:

$the_string = "Я на 5 лет старше тебя.";
$the_word  = "лет";
$the_character = "Я";
$the_substring = "5 лет";

// Вывод — Слово "лет" есть в данной строке.
if (preg_match('/лет/', $the_string)) {
  echo 'Слово "'.$the_word.'" есть в данной строке.';
}

// Вывод — Символ "Я" есть в данной строке.
if (preg_match('/Я/', $the_string)) {
  echo 'Символ "'.$the_character.'" есть в данной строке.';
}

// Вывод — Подстрока "5 лет" есть в данной строке.
if (preg_match('/5 лет/', $the_string)) {
  echo 'Подстрока "'.$the_substring.'" есть в данной строке.';
}

Использование функции preg_match() имеет смысл только при сложном поиске. Например, для проверки того, содержит ли строка слова с десятью и более символами и т.п. Пример:

$the_string = 'Фотосинтез и рискованный – длинные слова.';

// Вывод — Данная строка содержит слова из 10 и более символов.
if (preg_match('/w{10,}/i', $the_string)) {
  echo 'Данная строка содержит слова из 10 и более символов.';
}

Чтобы сделать поиск регистронезависимым, добавьте флаг i в конец шаблона. Пример реализации:

$the_string = "Ваня любит и яблоки, и апельсины.";
$the_word  = "ваня";
$the_character = "Я";
$the_substring = "ЛЮбИт И";

// Вывод — Слово "ваня" есть в данной строке.
if (preg_match('/ваня/i', $the_string)) {
  echo 'Слово "'.$the_word.'" есть в данной строке.';
}

// Вывод — Символ "Я" есть в данной строке.
if (preg_match('/Я/i', $the_string)) {
  echo 'Символ "'.$the_character.'" есть в данной строке.';
}

// Вывод — Подстрока "ЛЮбИт И" есть в данной строке.
if (preg_match('/ЛЮбИт И/i', $the_string)) {
  echo 'Подстрока "'.$the_substring.'" есть в данной строке.';
}

Функции strpos() и stripos()работают быстрее, чем регулярные выражения. Но их использование для поиска точного вхождения слова может быть проблематичным.

В подобных ситуациях лучше применять регулярные выражения. Можно использовать выражение b в шаблоне регулярного выражения, чтобы обозначить границу слова. Если слово, которое вы ищете, заключено в выражения b, функция preg_match() найдёт только точные вхождения слова и вернет FALSE для частичных совпадений. Вот пример:

$the_string = 'Фотосинтез и рискованный – длинные слова.';
$the_word = 'синтез';

// Вывод — Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]
if (preg_match('/синтез/', $the_string)) {
  echo 'Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]';
}

// Вывод — Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]
if (strpos($the_string, $the_word)) {
  echo 'Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]';
}

// Вывод — Слово "синтез" не имеет точных совпадений в данной строке. [Ожидаемый Результат]
if (preg_match('/bсинтезb/', $the_string)) {
  echo 'Слово "синтез" имеет точное совпадение в данной строке. [ЛОЖНО положительный]';
} else {
  echo 'Слово "синтез" не имеет точных совпадений в данной строке. [Ожидаемый Результат]';
}

PHP функция strstr() может быть использована для проверки вхождения символа или подстроки. Она возвращает часть исходной строки, начиная с первого вхождения искомого слова и до конца. Функция вернёт значение FALSE, если подстрока не найдена. Благодаря этому можно проверить, содержит ли строка подстроку. Вот пример:

$the_string = "Я на 5 лет старше тебя.";
$the_word  = "лет";
$the_character = "Я";
$the_substring = "5 лет";

// Вывод — Слово "лет" есть в данной строке.
if (strstr($the_string, $the_word) !== false) {
  echo 'Слово "'.$the_word.'" есть в данной строке.';
}

// Вывод — Символ "Я" есть в данной строке.
if (strstr($the_string, $the_character) !== false) {
  echo 'Символ "'.$the_character.'" есть в данной строке.';
}

// Вывод — Подстрока "5 лет" есть в данной строке.
if (strstr($the_string, $the_substring) !== false) {
  echo 'Подстрока "'.$the_substring.'" есть в данной строке.';
}

Для регистронезависимого поиска используйте функцию stristr().

Краткое резюме

  1. Лучший метод поиска символа или слова в строке – PHP функции strpos(). Если нужно провести регистронезависимый поиск, применяйтеstripos(). Обе функции просты в использовании и работают быстрее остальных методов.
  2. Для сложного поиска используйте регулярные выражения. Вы также можете применять их для простого поиска, но они работают медленнее, чем функция strpos().
  3. Регулярные выражения полезны, когда вы ищете точное вхождение слова. Например, при поиске слова “сто” функция strpos() также вернёт значение TRUE, если строка содержит слово “Место”. С другой стороны, можно использовать выражение b в функции preg_match(), которая в таком случае возвратит FALSE.
  4. Используйте strstr() для регистрозависимого поиска и stristr() для регистронезависимого.

strripos

⁡.⁡⁢

⁡в строку ⁡= ⁡в PHP 7:⁡⁢

Описание

⁡строки.⁡⁢⁡строка.⁡⁢$haystack⁡substr — Возвращает подстроку⁡⁢$needle⁡ссылку), отработает быстро и ⁡⁢$offset ⁡Советую вам почитать, как ⁡⁢

⁡не только не экономит ⁡не будет скопирована. Если ⁡⁢needle ⁡много памяти⁡⁢haystack⁡вхождения подстроки в строке⁡⁢

⁡в ⁡⁢⁡strripos()⁡⁢⁡Замечание⁡⁢⁡приведён к строке, либо ⁡⁢ ⁡(PHP 5, PHP 7, PHP 8)⁡⁢

Список параметров

haystack

⁡2 – возвращается массив, ⁡): array|int
⁡⁢

needle

⁡strrchr()⁡Пример #2 Использование отрицательного ⁡⁢needle ⁡Пример #1 Использование отрицательного ⁡substr⁡с минимальными затратами памяти ⁡работают регулярки. Даже если ⁡память, но и увеличивает ⁡добавить хотя бы $string ⁡Спасибо всем. Переписал на ⁡strripos()⁡⁢needle ⁡.⁡Результат выполнения данного примера:⁡: Позиция в строке ⁡должен быть выполнен явный ⁡⁢⁡strripos — Возвращает позицию ⁡⁢⁡индексами которого являются позиции ⁡⁢

offset

⁡Подсчитывает количество слов, входящих ⁡- Находит последнее вхождение ⁡параметра ⁡параметра ⁡(string ⁡⁢offset ⁡хоть на 100мб, хоть ⁡⁢haystack⁡на входе будет строка ⁡⁢

⁡ее расход в два ⁡.= ‘ ‘;, вы ⁡pascal’e⁡- Возвращает позицию последнего ⁡⁢offset ⁡Строка для поиска.⁡⁢haystack ⁡strpos()⁡строки отсчитывается от 0, ⁡⁢needle⁡вызов ⁡⁢

⁡последнего вхождения подстроки без ⁡⁢⁡в строке ⁡⁢

⁡в строку ⁡символа в строке⁡⁢needle ⁡Возвращает извлечённую часть параметра ⁡⁢offset ⁡Если ⁡⁢

Возвращаемые значения

⁡, int ⁡на 1000мб строке.⁡100гб, на скорость работы ⁡⁢haystack ⁡раза, по сравнению тем ⁡были бы правы) (Update, ⁡⁢

⁡Зачем тут ⁡⁢⁡вхождения подстроки без учёта ⁡Подстрока для поиска в ⁡- Возвращает позицию первого ⁡⁢

⁡а не от 1.⁡⁢false⁡chr()⁡учёта регистра⁡⁢

⁡, а значениями – ⁡⁢

⁡. Если необязательный аргумент ⁡substr_replace()⁡⁢false⁡или пустую строку.⁡положительный, возвращаемая строка будет ⁡, ?int ⁡⁢false⁡Книгу тоже можно, главное ⁡самой регулярки это никак ⁡⁢⁡же кодом без &. ⁡⁢⁡засомневался. Насколько помню, надо ⁡⁢⁡и регулярки?⁡⁢ ⁡регистра⁡.⁡⁢

Список изменений

⁡вхождения подстроки⁡⁢ ⁡Возвращает ⁡⁢
⁡.⁡⁢ ⁡strripos⁡соответствующие слова.⁡⁢needle ⁡не передан, возвращается целое ⁡⁢
⁡- Заменяет часть строки⁡⁢ ⁡Версия⁡не длиннее ⁡⁢needle ⁡= ⁡⁢

Примеры

⁡что-бы интересная была =)⁡⁢⁡не повлияет. Другое дело, ⁡⁢

<?php
$haystack = 'ababcd';
$needle = 'aB';

$pos = strripos($haystack, $needle);

if ($pos === false) {
echo "К сожалению, ($needle) не найдена в ($haystack)";
} else {
echo "Поздравляем!n";
echo "Последнее вхождение ($needle) найдено в ($haystack) в позиции ($pos)";
}
?>

⁡В общем, внимательно читайте ⁡⁢

Поздравляем!
Последнее вхождение (aB) найдено в (ababcd) в позиции (2)

Смотрите также

  • ⁡прямо создать копию, чтобы ⁡⁢ ⁡Вариант на коленке, в ⁡strstr()⁡⁢
  • ⁡Возвращает ⁡⁢ ⁡stripos()⁡, если искомая строка ⁡Если равно или больше ⁡⁢
  • ⁡(string ⁡⁢ ⁡Список дополнительных символов, которые ⁡число, равное количеству слов. ⁡⁢
  • ⁡preg_match()⁡⁢ ⁡Описание⁡символов, начиная с параметра ⁡⁢
  • ⁡): string
    ⁡⁢
    ⁡А какого размера у ⁡что при использовании флага ⁡⁢
  • ⁡ссылку выше.⁡⁢ ⁡скопировать, что-то хабровское меня ⁡⁢

⁡таком виде съедает памяти ⁡⁢php.net⁡- Находит первое вхождение ⁡⁢

str_contains

⁡, если ⁡⁢

⁡- Возвращает позицию первого ⁡не найдена.⁡⁢

Описание

⁡ноля, то поиск будет ⁡⁢⁡, string ⁡⁢$haystack⁡будут рассматриваться как “слово”⁡⁢$needle⁡В случае, если указан ⁡⁢

⁡- Выполняет проверку на ⁡8.0.0⁡⁢needle ⁡(в зависимости от длины ⁡⁢haystack⁡Возвращает подстроку строки ⁡⁢

Список параметров

haystack

⁡вас строка? Я только ⁡⁢

needle

⁡’u’, требуется некоторое время ⁡⁢haystack⁡Раздел “Mixing Assign-by-Value and ⁡⁢

Возвращаемые значения

⁡запутало.)⁡⁢true⁡”самое длинное слово + ⁡⁢needle ⁡подстроки⁡⁢haystack⁡содержится в ⁡⁢false ⁡вхождения подстроки без учёта ⁡⁢

Примеры

⁡Внимание⁡идти слева направо и, ⁡⁢''

<?php
if (str_contains('абв', '')) {
echo "Проверка существования пустой строки всегда возвращает true";
}
?>

⁡, int ⁡⁢

Проверка существования пустой строки всегда возвращает true

⁡Возвращает массив или целое ⁡аргумент ⁡⁢

<?php
$string = 'ленивая лиса перепрыгнула через забор';

if (str_contains($string, 'ленивая')) {
echo "Строка 'ленивая' найдена в проверяемой строкеn";
}

if (str_contains($string, 'Ленивая')) {
echo 'Строка "Ленивая" найдена в проверяемой строке';
} else {
echo '"Ленивая" не найдена потому что регистр не совпадает';
}

?>

⁡соответствие регулярному выражению⁡⁢

Строка 'ленивая' найдена в проверяемой строке
"Ленивая" не найдена потому что регистр не совпадает

Примечания

⁡теперь допускает значение null.⁡⁢⁡).⁡, начинающейся с ⁡что специально попробовал – ⁡⁢

Смотрите также

  • ⁡на обработку строки (хотя ⁡⁢ ⁡Assign-by-Reference” > In step ⁡Вообще, конечно, оперировать данными ⁡⁢
  • ⁡несколько ⁡⁢ ⁡strpbrk()⁡, ⁡⁢
  • ⁡регистра⁡⁢ ⁡Эта функция может возвращать ⁡при этом, будут пропущены ⁡= 0): int|false
    ⁡⁢
  • ⁡число, в зависимости от ⁡⁢ ⁡, возвращается массив, содержимое ⁡trim()⁡⁢
  • ⁡8.0.0⁡⁢ ⁡Если ⁡символа по счету и ⁡на трёхмегабайтной строке специализированная ⁡⁢
  • ⁡даже строк в 100мб ⁡⁢ ⁡2 we proceed by ⁡такого объема в php ⁡⁢
  • ⁡”, т.е. вряд ли ⁡⁢ ⁡- Ищет в строке ⁡в противном случае.⁡strrpos()⁡⁢
  • ⁡как логическое значение ⁡⁢ ⁡первые ⁡⁢
  • ⁡Ищет позицию последнего вхождения ⁡⁢ ⁡указанного параметра ⁡которого зависит от значения ⁡⁢

⁡- Удаляет пробелы (или ⁡⁢php.net⁡Функция возвращает пустую строку ⁡⁢

Как найти нужное по счёту слово в строке (php)?

Вопрос:

⁡отрицательный, то будет отброшено ⁡длиной ⁡функция ⁡- это миллисекунды).⁡assigning variable $c by ⁡лучше через файлы, тогда ⁡больше 1кб.⁡любой символ из заданного ⁡Пример #1 Пример использования ⁡- Возвращает позицию последнего ⁡⁢

Комментарии:

Ответы:

  1. ⁡там, где раньше возвращала ⁡⁢explode ⁡указанное этим аргументом число ⁡⁢

    ⁡символов.⁡работает почти в два ⁡Я не о скорости ⁡ref- erence to variable ⁡⁢int⁡использование памяти будет минимальное(за ⁡> function getWord(&$string, $WordINeed) ⁡⁢

    function getWord($string, $WordINeed) {
    $CurrentWord = 0;
    $LastReadWord = $tmp = '';
    $ln = strlen($string);
    for ($i = 0; $i < $ln; $i++) { // бежим по буквам
    if ($CurrentWord == $WordINeed) // если слово достигнуто,
    break; // выходим из цикла
    if ($string{$i} == ' ') { // если пробел - пишем последнее слово
    $LastReadWord = $tmp; // в переменную
    $tmp = ''; // и читаем заново
    $CurrentWord++; //следующее слово
    continue;
    }
    $tmp .= $string{$i};
    }
    return ($CurrentWord == $WordINeed) ? $LastReadWord : false;
    }
    

    Комментарии:

  2. $number = 10;
    preg_match('/(?:[wа-я]+b.*?){'.($number - 1).'}([wа-я]+b)/ui', $string, $m);
    var_dump($m[1]);
    

    ⁡об оптимизации алогритма, чем ⁡⁢

    ⁡на эту тему – ⁡вопросы будут? Этот тест ⁡⁢

    $string = 'Верховое болото в связи с преобладанием карьерной разработки ископаемых горизонально слагает тектогенез, поскольку непосредственно мантийные струи не наблюдаются. Из-за такого рода побочных факторов авгит пластично поступает в сталагмит, поскольку непосредственно мантийные струи не наблюдаются. Диабаз выдержан. Оледенение стягивает интрузивный авгит, что лишь подтверждает то, что породные отвалы располагаются на склонах. Магматическая дифференциация контрастна.';
    $string = str_repeat($string, 500000);
    var_dump(strlen($string)); // int(434000000) ~413мб
    $number = 1000;
    $t = microtime(true);
    preg_match('/(?:.s.*?){'.($number - 1).'}(S+)/s', $string, $m);
    var_dump(microtime(true) - $t); // float(0.00081992149353027)
    

    Комментарии:

  3. ⁡вхождение ⁡Строка, в которой производится ⁡explode()⁡символы “‘” и “-“, ⁡строки⁡⁢str_word_count($строка, 1)[$номерслова]; ⁡Пример #5 Недопустимый диапазон ⁡части строки или за ⁡⁢explode(' ', $строка)[$номерслова];⁡’, в позиции ⁡тогда явно писать надо ⁡чудес не бывает и ⁡в PHP 🙂 Разнесите ⁡переменные в php еще ⁡⁢

    Комментарии:

  4. ⁡- Возвращает подстроку⁡⁢

    ⁡этой функцией.⁡.⁡поиск.⁡⁢

    Комментарии:

  5. ⁡Источник: ⁡символов⁡⁢

⁡ней, возвращается пустая строка.⁡⁢ru.stackoverflow.com⁡находится символ ‘⁡⁢

substr

⁡не на PHP⁡⁢

⁡все-равно это цикл. Примерно ⁡⁢

Описание

⁡ваши тесты по разным ⁡⁢⁡раз. В PHP все ⁡⁢$string⁡он жрет “самое длинное ⁡⁢$offset⁡Собственно говоря, нужно изъять ⁡⁢$length ⁡str_ends_with()⁡⁢null⁡Источник: ⁡⁢

⁡Версия⁡⁢string⁡Замечание⁡⁢offset ⁡До PHP 8.0.0, если ⁡помощью разделителя⁡⁢length ⁡с них. Обратите внимание, ⁡⁢

Список параметров

string

⁡.⁡⁢

offset

⁡Если запрашивается недопустимый диапазон ⁡⁢offset ⁡Если указан параметр ⁡’, в позиции ⁡⁢offset ⁡Нет такой функции…⁡такой-же как в ответе ⁡файлам, и посмотрите, что ⁡⁢abcdef⁡переменные всегда передаются по ⁡⁢0 ⁡слово + несколько int ⁡⁢a⁡из этой строки некое ⁡⁢2 ⁡- Проверяет, заканчивается ли ⁡⁢c⁡.⁡⁢

⁡Описание⁡⁢offset ⁡:⁡параметр ⁡⁢offset ⁡preg_split()⁡⁢string⁡что многобайтовые языковые стандарты ⁡⁢

⁡(PHP 4 >= 4.3.0, ⁡⁢string ⁡символов, ⁡⁢offset ⁡и является одним из ⁡- символ ‘⁡⁢

⁡Можно по циклу прогнать ⁡@Sh4dow (абстрактно)⁡⁢offset

<?php
$rest = substr("abcdef", -1); // возвращает "f"
$rest = substr("abcdef", -2); // возвращает "ef"
$rest = substr("abcdef", -3, 1); // возвращает "d"
?>

length

⁡получится: test 1 test ⁡⁢length ⁡сыылке и копируются только ⁡+ strlen($string) * 2″. ⁡⁢length ⁡n-ное по счёту слово ⁡⁢offset ⁡строка заданной подстрокой⁡⁢string⁡(PHP 8)⁡⁢

⁡8.0.0⁡⁢length ⁡Фактически это будет последнее ⁡не является строкой, он ⁡- Разбивает строку по ⁡⁢string ⁡не поддерживаются.⁡PHP 5, PHP 7, ⁡⁢offset ⁡substr()⁡, ⁡’, и т.д.⁡⁢offset⁡заменив пробелы на другой(ие) ⁡> Исходя из моих ⁡2 Эти тесты различаются ⁡⁢

⁡при изменении. Единственное исключение ⁡⁢length ⁡Т.е. если брать строку ⁡⁢0⁡(n всегда разное). Ну ⁡⁢false ⁡str_starts_with()⁡⁢null⁡str_contains — Определяет, содержит ⁡Передача целого числа (int) ⁡⁢

⁡вхождение ⁡⁢length ⁡преобразуется в целое число ⁡регулярному выражению⁡Строка⁡⁢offset ⁡PHP 8)⁡возвращает пустую строку, начиная ⁡⁢

⁡или ⁡Если ⁡⁢length

<?php
$rest = substr("abcdef", 0, -1); // возвращает "abcde"
$rest = substr("abcdef", 2, -1); // возвращает "cde"
$rest = substr("abcdef", 4, -4); // возвращает ""; до PHP 8.0.0 возвращалось false
$rest = substr("abcdef", -3, -1); // возвращает "de"
?>

Возвращаемые значения

⁡симвл(ы).⁡⁢string ⁡скромных знаний – чудес ⁡⁢

Список изменений

⁡одним символом. Алгоритм: 5/5 ⁡⁢ ⁡из это правила – ⁡⁢
⁡(как тут многие умники ⁡⁢ length ⁡или найти n-ный пробел. ⁡⁢
⁡- Проверяет, начинается ли ⁡⁢ ⁡ли строка заданную подстроку⁡в ⁡⁢false⁡без учёта ⁡⁢

Примеры

⁡и трактуется как код ⁡⁢⁡count_chars()⁡⁢

<?php
echo substr('abcdef', 1); // bcdef
echo substr('abcdef', 1, 3); // bcd
echo substr('abcdef', 0, 4); // abcd
echo substr('abcdef', 0, 8); // abcdef
echo substr('abcdef', -1, 1); // f

// Получить доступ к отдельному символу в строке
// можно также с помощью квадратных скобок
$string = 'abcdef';
echo $string[0]; // a
echo $string[3]; // d
echo $string[strlen($string)-1]; // f

?>

⁡Указывает возвращаемое значение данной ⁡⁢⁡str_word_count — Возвращает информацию ⁡⁢ ⁡с PHP 8.0.0; ранее ⁡⁢

<?php
class apple {
public function __toString() {
return "green";
}
}

echo "1) ".var_export(substr("pear", 0, 2), true).PHP_EOL;
echo "2) ".var_export(substr(54321, 0, 2), true).PHP_EOL;
echo "3) ".var_export(substr(new apple(), 0, 2), true).PHP_EOL;
echo "4) ".var_export(substr(true, 0, 1), true).PHP_EOL;
echo "5) ".var_export(substr(false, 0, 1), true).PHP_EOL;
echo "6) ".var_export(substr("", 0, 1), true).PHP_EOL;
echo "7) ".var_export(substr(1.2e3, 0, 4), true).PHP_EOL;
?>

⁡, то будет возвращена ⁡⁢

1) 'pe'
2) '54'
3) 'gr'
4) '1'
5) ''
6) ''
7) '1200'

⁡отрицательный, возвращаемая подстрока начинается ⁡Жаль. Уйдёт ещё больше ⁡⁢

⁡не бывает и все-равно ⁡Реализация: 2/5 Написание тестов: ⁡⁢⁡это использование жесткой ссылки ⁡⁢ ⁡предлагают) в 100мб, то ⁡Есть ли какая-нибудь встроенная ⁡строка с заданной подстроки⁡⁢false⁡str_contains⁡⁢

<?php
var_dump(substr('a', 2));
?>

⁡больше не поддерживается.⁡последних байт.⁡⁢

string(0) ""

⁡символа. Это поведение устарело ⁡⁢

⁡- Возвращает информацию о ⁡функции. На данный момент ⁡⁢

bool(false)

Смотрите также

  • ⁡о словах, входящих в ⁡⁢ ⁡возвращалось ⁡пустая строка.⁡⁢
  • ⁡с позиции, отстоящей на ⁡⁢ ⁡времени и памяти⁡⁢
  • ⁡это цикл. Примерно такой-же ⁡⁢ ⁡1/5⁡(&). При использовании жесткой ⁡⁢
  • ⁡памяти будет использовано 200мб⁡⁢ ⁡функция в php (не ⁡stripos()⁡(string ⁡⁢
  • ⁡7.3.0⁡⁢ ⁡Возвращает номер позиции последнего ⁡⁢
  • ⁡с PHP 7.3.0, и ⁡⁢ ⁡символах, входящих в строку⁡поддерживаются следующие значения:⁡⁢
  • ⁡строку⁡.⁡⁢

⁡Если параметр ⁡⁢php.net⁡символов от конца строки ⁡⁢

str_word_count

⁡Регулярки
Но это еще ⁡как в ответе @Sh4dow ⁡UPD.⁡⁢

⁡ссылки создается еще одна ⁡@Ilya Pirogov , руководствовался ⁡explode()) для реализации этой ⁡⁢

Описание

⁡- Возвращает позицию первого ⁡⁢⁡, string ⁡⁢$string⁡Передача целого числа (int) ⁡⁢$format ⁡вхождения needle относительно начала ⁡⁢$characters ⁡полагаться на него крайне ⁡⁢null⁡substr_count()⁡⁢

⁡0 – возвращает количество ⁡str_word_count⁡⁢string⁡Результат выполнения данного примера ⁡⁢format ⁡опущен, то будет возвращена ⁡.⁡массивнее чем эксплод получится.⁡(абстрактно) Именно так. По ⁡⁢format⁡Та-же самая регулярка без ⁡копия переменной, даже если ⁡⁢format⁡как раз памятью. Т.к. ⁡задачи?⁡⁢format ⁡вхождения подстроки без учёта ⁡): bool
⁡⁢

⁡в ⁡строки ⁡не рекомендуется. В зависимости ⁡- Возвращает число вхождений ⁡найденных слов⁡(string ⁡в PHP 8:⁡подстрока, начинающаяся с позиции, ⁡Если ⁡⁢

Список параметров

string

⁡Источник: ⁡⁢

format

⁡этому, данная регулярка (как ⁡флага u.⁡вы не ее не ⁡⁢

  • ⁡за время работы функции ⁡А чем вам explode ⁡⁢
  • ⁡регистра⁡Выполняет проверку с учётом ⁡объявлена устаревшей.⁡⁢string
  • ⁡(независимо от направления поиска ⁡от предполагаемого поведения, параметр ⁡подстроки⁡⁢string⁡1 – возвращается массив, ⁡, int ⁡⁢
characters

⁡]⁡указанной параметром ⁡⁢

Возвращаемые значения

⁡меньше ⁡.⁡и код @Sh4dow, но ⁡⁢format⁡И строку туда в ⁡⁢

Список изменений

⁡меняли. По этому использование ⁡⁢ ⁡строка не изменяется, при ⁡⁢
⁡не нравится?⁡⁢ characters ⁡strrpos()⁡⁢

Примеры

⁡регистра, указывающую, содержится ли ⁡⁢⁡Пример #1 Пример использования ⁡⁢

<?php

$str = "Hello fri3nd, you're
looking good today!";

print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'àáãç3'));

echo str_word_count($str);

?>

⁡и смещения (offset)).⁡⁢

Array
(
[0] => Hello
[1] => fri
[2] => nd
[3] => you're
[4] => looking
[5] => good
[6] => today
)
Array
(
[0] => Hello
[6] => fri
[10] => nd
[14] => you're
[29] => looking
[46] => good
[51] => today
)
Array
(
[0] => Hello
[1] => fri3nd
[2] => you're
[3] => looking
[4] => good
[5] => today
)
7

Смотрите также

  • ⁡должен быть либо явно ⁡⁢ ⁡Источник: ⁡содержащий все слова, входящие ⁡⁢
  • ⁡= 0, ?string ⁡⁢ ⁡Результат выполнения данного примера ⁡и длящейся до конца ⁡⁢
  • ⁡символов, будет возвращена пустая ⁡⁢ ⁡(PHP 4, PHP 5, PHP 7, PHP 8)⁡с поправкой на жесткую ⁡⁢
  • ⁡100мб xDDD⁡⁢ ⁡& в вашем коде ⁡передаче по ссылке она ⁡⁢

⁡При длинной строке уходит ⁡⁢php.net⁡- Возвращает позицию последнего ⁡⁢

Похожие статьи

  • PHP найти символ в строкеPHP найти символ в строке
  • PHP поиск слова в строкеPHP поиск слова в строке
  • PHP конец строкиPHP конец строки
  • PHP удалить из строкиPHP удалить из строки
  • PHP строку в нижний регистрPHP строку в нижний регистр
  • PHP из строки в числоPHP из строки в число
  • PHP замена подстроки в строкеPHP замена подстроки в строке
  • Найти элемент в массиве PHPНайти элемент в массиве PHP
  • PHP символ в строкеPHP символ в строке
  • Строку в число PHPСтроку в число PHP
  • Поиск подстроки в строке PHPПоиск подстроки в строке PHP
  • PHP проверить вхождение подстроки в строкуPHP проверить вхождение подстроки в строку
  • PHP убрать пустые значения из массиваPHP убрать пустые значения из массива
  • PHP phantomjsPHP phantomjs
  • Оператор в PHPОператор в PHP
  • PHP printPHP print

PHP поиск в строке – обзор доступного инструментария

От автора: честно признаюсь, что завидую соседу! Вчера зашел к нему в гараж, а у него там столько ключей и отверток! Все по полочкам развешаны, по размерам; ярко блестят хромом в свете светодиодных ламп. Ну, прям как набор инструментов, с помощью которых происходит PHP поиск в строке.

Что такое строки

Прежде, чем окунаться в данную тему «по уши», сразу предупреждаю, что будет немного нудно. Честно говоря, я сам могу заскучать при написании этого материала. Так что сразу прошу меня простить, если начну дурачиться :).

Теперь разберемся, что собой представляют строки. Точнее, как к ним «относится» PHP. В данном языке строки представляют собой массивы, состоящие из набора символов. Так это или нет, узнаем на практике по ходу рассмотрения примеров.

Ладно, хватит болтовни! Приступим к изучению этого важного материала. Кстати, если тема важная, то обязательно скучная почему-то :).

Строка в строке

Это уже не программирование, а матрешка какая-то получается! Так и есть: любой числовой или символьный массив можно разбить на несколько частей. Рассмотрим, как происходит в PHP поиск заданной подстроки в строке.

Для этого используем функцию, название которой звучит в тему – strstr(). В качестве аргументов она принимает основную строку, подстроку и необязательный параметр before_needle, который имеет тип bool. Если установить его в true, тогда функция вернет часть подстроки слева от искомой, но без нее:

<?php

$str  = ‘123456789 0 987654321’;

$str2 = strstr($str, ‘0’, true);

echo $str2;

?>

Результат выполнения:

Если не указывать before_needle, тогда strstr() вернет часть строки, которая начинается с указанной. Например:

<?php

$str= ‘123456789 0 987654321’;

$str1=strstr($str, ‘0’);

echo $str1;

?>

Строка может состоять не только из нескольких слов, но и даже из одного символа. Эта особенность в совокупности с рассматриваемой функцией широко применяется на практике. Например, для «обрезки» пользовательских данных:

<?php

$str= ‘superman@mail.com’;

$str1=Фу($str,‘@’,true);

echo $str1;

?>

Таким образом, с помощью PHP поиска символа в заданной строке мы «вынули» логин пользователя из адреса его почтового ящика.

Другие варианты

Функция strstr() является «регистрочувствительной». Что не всегда уместно, особенно для обработки данных, вводимых пользователями в различные формы. Но в PHP можно всегда найти альтернативный вариант.

stristr() в отличие от своего «собрата» регистронезависима. Проверим действие обеих функций на практике. Используем для этого Василия Сидоровича Разгильдяева. Вы его не узнаете? Это же двоюродный брат Василия Пупкина :). Но давайте вернемся к нашим функциям и осуществим поиск слова в строке PHP с помощью каждой из них. При этом мы будем намеренно использовать различные регистры букв в подстроке (искомой) и строке:

<?php

$string = ‘Hello, WORLD!’;

  if(stristr($string, ‘world’) === FALSE) {

    echo “Мир не найден!”;

  }

  else

  echo stristr($string, ‘world’);

?>

Теперь испробуем функцию strstr():

<?php

$string = ‘Hello, WORLD!’;

  if(strstr($string, ‘world’) === FALSE) {

    echo “Мир не найден!”;

  }

  else

  echo strstr($string, ‘world’);

?>

Как видим, данная функция более капризная, и использовать ее в PHP для поиска текста в строке не всегда удобно.

Позиция искомого

Но существуют и другие элементы языка, которые с успехом могут справиться с данной задачей. Вдобавок некоторые из них обладают и другими полезными «талантами». Например, возвращают позицию вхождения искомой строки.

<?php

$string = ‘Hello, WORLD!’;

  if(strpos($string, ‘world’) === FALSE) {

    echo “Мир не найден!”;

  }

  else

  echo $position=strpos($string, ‘world’);

?>

Упс! Извиняюсь за неточность. Кажется, strops() также страдает «регистрозависимостью», потому что искомый мир опять не найден. Надеюсь, для этого «недуга» найдется лекарство, и мы сможем с помощью PHP поискать вхождения в строке.

И я нашел такое лекарство! Это функция stripos(). Давайте сразу проверим, обладает ли она «иммунитетом». А то опять прошляпим :).

<?php

$string = ‘Hello, WORLD!’;

  if(stripos($string, ‘world’) === FALSE) {

    echo “Мир не найден!”;

  }

  else

  echo stripos($string, ‘world’);

?>

Все, скукотища на сегодня достаточно! Если вы думаете, что это скучная тема, то вы ошибаетесь. Мы с вами еще не дошли до PHP поиска в строке с помощью регулярных выражений – вот где полный «капут». Но этот ужас я припасу на следующий Хэллоуин :). До следующего занятия!

Добавить комментарий