Как найти пробел в строке php

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

strrposFind the position of the last occurrence of a substring in a string

Description

strrpos(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 zero or positive, the search is performed left to right skipping the
first offset bytes of the
haystack.

If negative, the search is performed right to left skipping the
last offset bytes of the
haystack and searching for the first occurrence
of needle.

Note:

This is effectively looking for the last occurrence of
needle before the last
offset bytes.

Return Values

Returns the position where the needle exists relative to the beginning of
the haystack string (independent of search direction
or offset).

Note:

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.

Examples

Example #1 Checking if a needle is in the haystack

It is easy to mistake the return values for «character found at
position 0» and «character not found». Here’s how to detect
the difference:


<?php

$pos

= strrpos($mystring, "b");
if (
$pos === false) { // note: three equal signs
// not found...
}?>

Example #2 Searching with offsets


<?php
$foo
= "0123456789a123456789b123456789c";// Looking for '0' from the 0th byte (from the beginning)
var_dump(strrpos($foo, '0', 0));// Looking for '0' from the 1st byte (after byte "0")
var_dump(strrpos($foo, '0', 1));// Looking for '7' from the 21th byte (after byte 20)
var_dump(strrpos($foo, '7', 20));// Looking for '7' from the 29th byte (after byte 28)
var_dump(strrpos($foo, '7', 28));// Looking for '7' right to left from the 5th byte from the end
var_dump(strrpos($foo, '7', -5));// Looking for 'c' right to left from the 2nd byte from the end
var_dump(strrpos($foo, 'c', -2));// Looking for '9c' right to left from the 2nd byte from the end
var_dump(strrpos($foo, '9c', -2));
?>

The above example will output:

int(0)
bool(false)
int(27)
bool(false)
int(17)
bool(false)
int(29)

See Also

  • strpos() — Find the position of the first occurrence of a substring in a string
  • stripos() — Find the position of the first occurrence of a case-insensitive substring in a string
  • strripos() — Find the position of the last occurrence of a case-insensitive substring in a string
  • strrchr() — Find the last occurrence of a character in a string
  • substr() — Return part of a string

brian at enchanter dot net

15 years ago


The documentation for 'offset' is misleading.

It says, "offset may be specified to begin searching an arbitrary number of characters into the string. Negative values will stop searching at an arbitrary point prior to the end of the string."

This is confusing if you think of strrpos as starting at the end of the string and working backwards.

A better way to think of offset is:

- If offset is positive, then strrpos only operates on the part of the string from offset to the end. This will usually have the same results as not specifying an offset, unless the only occurences of needle are before offset (in which case specifying the offset won't find the needle).

- If offset is negative, then strrpos only operates on that many characters at the end of the string. If the needle is farther away from the end of the string, it won't be found.

If, for example, you want to find the last space in a string before the 50th character, you'll need to do something like this:

strrpos($text, " ", -(strlen($text) - 50));

If instead you used strrpos($text, " ", 50), then you would find the last space between the 50th character and the end of the string, which may not have been what you were intending.


david dot mann at djmann dot co dot uk

5 years ago


Ten years on, Brian's note is still a good overview of how offsets work, but a shorter and simpler summary is:

    strrpos($x, $y, 50);  // 1: this tells strrpos() when to STOP, counting from the START of $x
    strrpos($x, $y, -50); // 2: this tells strrpos() when to START, counting from the END of $x

Or to put it another way, a positive number lets you search the rightmost section of the string, while a negative number lets you search the leftmost section of the string.

Both these variations are useful, but picking the wrong one can cause some highly confusing results!


dave at pixelmetrics dot com

3 years ago


The description of offset is wrong. Here’s how it works, with supporting examples.

Offset effects both the starting point and stopping point of the search. The direction is always right to left. (The description wrongly says PHP searches left to right when offset is positive.)

Here’s how it works:
When offset is positive, PHP searches right to left from the end of haystack to offset. This ignores the left side of haystack.

When offset is negative, PHP searches right to left, starting offset bytes from the end, to the start of haystack. This ignores the right side of haystack.

Example 1:
$foo = ‘aaaaaaaaaa’;
var_dump(strrpos($foo, 'a', 5));
Result: int(10)

Example 2:
$foo = "aaaaaa67890";
var_dump(strrpos($foo, 'a', 5));
Result: int(5)

Conclusion: When offset is positive, PHP searches right to left from the end of haystack.

Example 3:
$foo = "aaaaa567890";
var_dump(strrpos($foo, 'a', 5));
Result: bool(false)

Conclusion: When offset is positive, PHP stops searching at offset.

Example 4:
$foo = ‘aaaaaaaaaa’;
var_dump(strrpos($foo, 'a', -5));
Result: int(6)

Conclusion: When offset is negative, PHP searches right to left, starting offset bytes from the end.

Example 5:
$foo = "a234567890";
var_dump(strrpos($foo, 'a', -5));
Result: int(0)

Conclusion: When offset is negative, PHP searches right to left, all the way to the start of haystack.


Daniel Brinca

15 years ago


Here is a simple function to find the position of the next occurrence of needle in haystack, but searching backwards  (lastIndexOf type function):

//search backwards for needle in haystack, and return its position
function rstrpos ($haystack, $needle, $offset){
    $size = strlen ($haystack);
    $pos = strpos (strrev($haystack), $needle, $size - $offset);

        if ($pos === false)
        return false;

        return $size - $pos;
}

Note: supports full strings as needle


anonymous

2 years ago


There is a lot of confusion around how $offset works and I feel it's really quite simple.

If $offset is positive, the operation ignores the first $offset characters of the haystack.
If $offset is negative, the operation ignores the last $offset-1 characters of the haystack (don't ask why -1...).

To understand this instinctively, just imagine the characters being replaced with invalid symbols. Here's an example:

<?php
$hackstack
= '0123456789';// Search the entire sequence 0123456789
var_dump(strrpos($hackstack, '0')); // int(0)
var_dump(strrpos($hackstack, '9')); // int(9)

// Only search ##23456789

var_dump(strrpos($hackstack, '1', 2)); // bool(false)
var_dump(strrpos($hackstack, '2', 2)); // int(2)

// Only search 0123456###

var_dump(strrpos($hackstack, '6', -4)); // int(6)
var_dump(strrpos($hackstack, '7', -4)); // bool(false)?>


dmitry dot polushkin at gmail dot com

16 years ago


Returns the filename's string extension, else if no extension found returns false.
Example: filename_extension('some_file.mp3'); // mp3
Faster than the pathinfo() analogue in two times.
<?php
function filename_extension($filename) {
   
$pos = strrpos($filename, '.');
    if(
$pos===false) {
        return
false;
    } else {
        return
substr($filename, $pos+1);
    }
}
?>

escii at hotmail dot com ( Brendan )

18 years ago


I was immediatley pissed when i found the behaviour of strrpos ( shouldnt it be called charrpos ?) the way it is, so i made my own implement to search for strings.

<?
function proper_strrpos($haystack,$needle){
        while($ret = strrpos($haystack,$needle))
        {      
                if(strncmp(substr($haystack,$ret,strlen($needle)),
                                $needle,strlen($needle)) == 0 )
                        return $ret;
                $haystack = substr($haystack,0,$ret -1 );
        }
        return $ret;
}
?>


fab

17 years ago


RE: hao2lian

There are a lot of alternative - and unfortunately buggy - implementations of strrpos() (or last_index_of as it was called) on this page. This one is a slight modifiaction of the one below, but it should world like a *real* strrpos(), because it returns false if there is no needle in the haystack.

<?phpfunction my_strrpos($haystack, $needle) {
  
$index = strpos(strrev($haystack), strrev($needle));
   if(
$index === false) {
        return
false;
   }
  
$index = strlen($haystack) - strlen($needle) - $index;
   return
$index;
}
?>


arlaud pierre

10 years ago


This seems to behave like the exact equivalent to the PHP 5 offset parameter for a PHP 4 version.

<?php
function strrpos_handmade($haystack, $needle, $offset = 0){

  if(

$offset === 0) return strrpos($haystack, $needle);$length = strlen($haystack);
 
$size = strlen($needle);

  if(

$offset < 0) {
   
$virtual_cut = $length+$offset;
   
$haystack = substr($haystack, 0, $virtual_cut+$size);
   
$ret = strrpos($haystack, $needle);
    return
$ret > $virtual_cut ? false : $ret;
  } else {
   
$haystack = substr($haystack, $offset);
   
$ret = strrpos($haystack, $needle);
    return
$ret === false ? $ret : $ret+$offset;
  }

}

?>


shimon at schoolportal dot co dot il

17 years ago


In strrstr function in php 4 there is also no offset.
<?
// by Shimon Doodkin
function chrrpos($haystack, $needle, $offset=false)
{
$needle=$needle[0];
$l=strlen($haystack);
if($l==0)  return false;
if($offset===false)  $offset=$l-1;
else
{
  if($offset>$l) $offset=$l-1;
  if($offset<0) return false;
}
for(;$offset>0;$offset--)
  if($haystack[$offset]==$needle)
   return $offset;
return false;
}
?>

islandispeace at hotmail dot com

7 years ago


$offset is very misleading, here is my understanding:

function mystrrpos($haystack, $needle, $offset = 0) {
    if ($offset == 0) {
        return strrpos ($haystack, $needle);
    } else {
        return strrpos (substr($haystack, 0, $offset), $needle);
    }
}


gordon at kanazawa-gu dot ac dot jp

17 years ago


The "find-last-occurrence-of-a-string" functions suggested here do not allow for a starting offset, so here's one, tried and tested, that does:

function my_strrpos($haystack, $needle, $offset=0) {
    // same as strrpos, except $needle can be a string
    $strrpos = false;
    if (is_string($haystack) && is_string($needle) && is_numeric($offset)) {
        $strlen = strlen($haystack);
        $strpos = strpos(strrev(substr($haystack, $offset)), strrev($needle));
        if (is_numeric($strpos)) {
            $strrpos = $strlen - $strpos - strlen($needle);
        }
    }
    return $strrpos;
}


alexandre at NOSPAM dot pixeline dot be

14 years ago


I needed to check if a variable that contains a generated folder name based on user input had a trailing slash.

This did the trick:

<?php

   
// Detect and remove a trailing slash

   
$root_folder = ((strrpos($root_folder, '/') + 1) == strlen($root_folder)) ? substr($root_folder, 0, - 1) : $root_folder;

?>


su.noseelg@naes, only backwards

20 years ago


Maybe I'm the only one who's bothered by it, but it really bugs me when the last line in a paragraph is a single word. Here's an example to explain what I don't like:

The quick brown fox jumps over the lazy

dog.

So that's why I wrote this function. In any paragraph that contains more than 1 space (i.e., more than two words), it will replace the last space with '&nbsp;'.

<?php

function no_orphans($TheParagraph) {

    if (
substr_count($TheParagraph," ") > 1) {

   
$lastspace = strrpos($TheParagraph," ");

   
$TheParagraph = substr_replace($TheParagraph,"&nbsp;",$lastspace,1);

    }

return
$TheParagraph;

}

?>



So, it would change "The quick brown fox jumps over the lazy dog." to "The quick brown fox jumps over the lazy&nbsp;dog." That way, the last two words will always stay together.


maxmike at gmail dot com

13 years ago


I've got a simple method of performing a reverse strpos which may be of use.  This version I have treats the offset very simply:
Positive offsets search backwards from the supplied string index.
Negative offsets search backwards from the position of the character that many characters from the end of the string.

Here is an example of backwards stepping through instances of a string with this function:

<?php
function backwardStrpos($haystack, $needle, $offset = 0){
   
$length = strlen($haystack);
   
$offset = ($offset > 0)?($length - $offset):abs($offset);
   
$pos = strpos(strrev($haystack), strrev($needle), $offset);
    return (
$pos === false)?false:( $length - $pos - strlen($needle) );
}
$pos = 0;
$count = 0;
echo
"Test1<br/>";
while((
$pos = backwardStrpos("012340567890", "0", $pos)) !== false){
     echo
$pos."<br/>";
   
$pos--;
    if(
$pos < 0){
        echo
"Done<br/>";break;
    }
}
echo
"---===---<br/>nTest2<br/>";
echo
backwardStrpos("12341234", "1", 2)."<br/>";
echo
backwardStrpos("12341234", "1", -2);
?>

Outputs:
Test1
11
5
0
Done
---===---
Test2
0
4

With Test2 the first line checks from the first 3 in "12341234" and runs backwards until it finds a 1 (at position 0)

The second line checks from the second 2 in "12341234" and seeks towards the beginning for the first 1 it finds (at position 4).

This function is useful for php4 and also useful if the offset parameter in the existing strrpos is equally confusing to you as it is for me.


FIE

20 years ago


refering to the comment and function about lastIndexOf()...

It seemed not to work for me the only reason I could find was the haystack was reversed and the string wasnt therefore it returnt the length of the haystack rather than the position of the last needle... i rewrote it as fallows:

<?php

function strlpos($f_haystack,$f_needle) {

     
$rev_str = strrev($f_needle);

     
$rev_hay = strrev($f_haystack);

     
$hay_len = strlen($f_haystack);

     
$ned_pos = strpos($rev_hay,$rev_str);

     
$result  = $hay_len - $ned_pos - strlen($rev_str);

      return
$result;

}

?>



this one fallows the strpos syntax rather than java's lastIndexOf.

I'm not positive if it takes more resources assigning all of those variables in there but you can put it all in return if you want, i dont care if i crash my server ;).

~SILENT WIND OF DOOM WOOSH!


jafet at g dot m dot a dot i dot l dot com

16 years ago


Full strpos() functionality, by yours truly.

<?php
function conforming_strrpos($haystack, $needle, $offset = 0)
{
   
# Why does strpos() do this? Anyway...
   
if(!is_string($needle)) $needle = ord(intval($needle));
   
$haystack = strval($haystack);
   
# Parameters
   
$hlen = strlen($haystack);
   
$nlen = strlen($needle);
   
# Come on, this is a feature too
   
if($nlen == 0)
    {
       
trigger_error(__FUNCTION__.'(): Empty delimiter.', E_USER_WARNING);
        return
false;
    }
   
$offset = intval($offset);
   
$hrev = strrev($haystack);
   
$nrev = strrev($needle);
   
# Search
   
$pos = strpos($hrev, $nrev, $offset);
    if(
$pos === false) return false;
    else return
$hlen - $nlen - $pos;
}
?>

Note that $offset is evaluated from the end of the string.

Also note that conforming_strrpos() performs some five times slower than strpos(). Just a thought.


dixonmd at gmail dot com

15 years ago


<?php

        $pos
= strlen(string $haystack) - strpos (strrev(string $haystack), strrev(string $needle)) - strlen(string $needle);

?>



         If in the needle there is more than one character then in php 4 we can use the above statement for finding the position of last occurrence of a substring in a string instead of strrpos. Because in php 4 strrpos uses the first character of the substring.

eg :

<?php

        $haystack
= "you you you you you";

       
$needle = "you";

       
$pos1 = strlen($haystack) - strpos (strrev($haystack), strrev($needle)) - strlen($needle);

        echo
$pos1 . "<br>";

       
$pos2 strrpos($haystack, $needle);

        echo
$pos2 . "<br>";

?>


kavih7 at yahoo dot com

16 years ago


<?php

###################################################

#

# DESCRIPTION:

# This function returns the last occurance of a string,

# rather than the last occurance of a single character like

# strrpos does. It also supports an offset from where to

# start the searching in the haystack string.

#

# ARGS:

# $haystack (required) -- the string to search upon

# $needle (required) -- the string you are looking for

# $offset (optional) -- the offset to start from

#

# RETURN VALS:

# returns integer on success

# returns false on failure to find the string at all

#

###################################################
function strrpos_string($haystack, $needle, $offset = 0)

{

    if(
trim($haystack) != "" && trim($needle) != "" && $offset <= strlen($haystack))

    {

       
$last_pos = $offset;

       
$found = false;

        while((
$curr_pos = strpos($haystack, $needle, $last_pos)) !== false)

        {

           
$found = true;

           
$last_pos = $curr_pos + 1;

        }

        if(
$found)

        {

            return
$last_pos - 1;

        }

        else

        {

            return
false;

        }

    }

    else

    {

        return
false;

    }

}

?>

stevewa

6 years ago


i wanted to find a leading space BEFORE a hyphen

Crude Oil (Dec) 51.00-56.00

so I had to find the position of the hyphen

then subtract that position from the length of the string (to make it a negative number)
and then walk left toward the beginning of the string, looking for the first space before the hyphen

ex:
$str_position_hyphen  = strpos($line_new,"-",$str_position_spread);

$line_new_length = strlen($line_new);

$str_position_hyphen_from_end = $str_position_hyphen - $line_new_length;

echo "hyphen position from end = " . $str_position_hyphen_from_end . "<br />n";

                        $str_position_space_before_hyphen  = strrpos($line_new, " ", $str_position_hyphen_from_end);

echo "*** previous space= " . $str_position_space_before_hyphen . "<br />n";

            $line_new = substr_replace($line_new, ",", $str_position_space_before_hyphen, 1  );   

    echo $line_new . "<br /><br />n";


lee at 5ss dot net

19 years ago


I should have looked here first, but instead I wrote my own version of strrpos that supports searching for entire strings, rather than individual characters.  This is a recursive function.  I have not tested to see if it is more or less efficient than the others on the page.  I hope this helps someone!

<?php

//Find last occurance of needle in haystack

function str_rpos($haystack, $needle, $start = 0){

   
$tempPos = strpos($haystack, $needle, $start);

    if(
$tempPos === false){

        if(
$start == 0){

           
//Needle not in string at all

           
return false;

        }else{

           
//No more occurances found

           
return $start - strlen($needle);

        }

    }else{

       
//Find the next occurance

       
return str_rpos($haystack, $needle, $tempPos + strlen($needle));

    }

}

?>


Christ Off

16 years ago


Function to truncate a string
Removing dot and comma
Adding ... only if a is character found

function TruncateString($phrase, $longueurMax = 150) {
    $phrase = substr(trim($phrase), 0, $longueurMax);
    $pos = strrpos($phrase, " ");
    $phrase = substr($phrase, 0, $pos);
    if ((substr($phrase,-1,1) == ",") or (substr($phrase,-1,1) == ".")) {
        $phrase = substr($phrase,0,-1);
    }
    if ($pos === false) {
        $phrase = $phrase;
    }
    else {
        $phrase = $phrase . "...";
    }
return $phrase;
}


jonas at jonasbjork dot net

18 years ago


I needed to remove last directory from an path, and came up with this solution:

<?php

  $path_dir

= "/my/sweet/home/";
 
$path_up = substr( $path_dir, 0, strrpos( $path_dir, '/', -2 ) )."/";
  echo
$path_up;?>

Might be helpful for someone..


griffioen at justdesign dot nl

18 years ago


If you wish to look for the last occurrence of a STRING in a string (instead of a single character) and don't have mb_strrpos working, try this:

    function lastIndexOf($haystack, $needle) {
        $index        = strpos(strrev($haystack), strrev($needle));
        $index        = strlen($haystack) - strlen(index) - $index;
        return $index;
    }


nexman at playoutloud dot net

18 years ago


Function like the 5.0 version of strrpos for 4.x.
This will return the *last* occurence of a string within a string.

    function strepos($haystack, $needle, $offset=0) {       
        $pos_rule = ($offset<0)?strlen($haystack)+($offset-1):$offset;
        $last_pos = false; $first_run = true;
        do {
            $pos=strpos($haystack, $needle, (intval($last_pos)+(($first_run)?0:strlen($needle))));
            if ($pos!==false && (($offset<0 && $pos <= $pos_rule)||$offset >= 0)) {
                $last_pos = $pos;
            } else { break; }
            $first_run = false;
        } while ($pos !== false);
        if ($offset>0 && $last_pos<$pos_rule) { $last_pos = false; }
        return $last_pos;
    }

If my math is off, please feel free to correct.
  - A positive offset will be the minimum character index position of the first character allowed.
  - A negative offset will be subtracted from the total length and the position directly before will be the maximum index of the first character being searched.

returns the character index ( 0+ ) of the last occurence of the needle.

* boolean FALSE will return no matches within the haystack, or outside boundries specified by the offset.


php dot net at insite-out dot com

20 years ago


I was looking for the equivalent of Java's lastIndexOf(). I couldn't find it so I wrote this:

<?php

/*

Method to return the last occurrence of a substring within a

string

*/

function last_index_of($sub_str,$instr) {

    if(
strstr($instr,$sub_str)!="") {

        return(
strlen($instr)-strpos(strrev($instr),$sub_str));

    }

    return(-
1);

}

?>



It returns the numerical index of the substring you're searching for, or -1 if the substring doesn't exist within the string.


php NO at SPAMMERS willfris SREMMAPS dot ON nl

16 years ago


<?php
/*******
** Maybe the shortest code to find the last occurence of a string, even in php4
*******/
function stringrpos($haystack,$needle,$offset=NULL)
{
    return
strlen($haystack)
           -
strpos( strrev($haystack) , strrev($needle) , $offset)
           -
strlen($needle);
}
// @return   ->   chopped up for readability.
?>

ZaraWebFX

19 years ago


this could be, what derek mentioned:

<?
function cut_last_occurence($string,$cut_off) {
    return strrev(substr(strstr(strrev($string), strrev($cut_off)),strlen($cut_off)));
}   

//    example: cut off the last occurence of "limit"
    $str = "select delta_limit1, delta_limit2, delta_limit3 from table limit 1,7";
    $search = " limit";
    echo $str."n";
    echo cut_last_occurence($str,"limit");
?>


mijsoot_at_gmail_dot_com

16 years ago


To begin, i'm sorry for my English.
So, I needed of one function which gives me the front last position of a character.
Then I said myself that it should be better to make one which gives the "N" last position.

$return_context = "1173120681_0__0_0_Mijsoot_Thierry";

// Here i need to find = "Mijsoot_Thierry"

//echo $return_context."<br />";// -- DEBUG

function findPos($haystack,$needle,$position){
    $pos = strrpos($haystack, $needle);
    if($position>1){
        $position --;
        $haystack = substr($haystack, 0, $pos);
        $pos = findPos($haystack,$needle,$position);
    }else{
        // echo $haystack."<br />"; // -- DEBUG
        return $pos;
    }
    return $pos;
}

var_dump(findPos($return_context,"_",2)); // -- TEST


genetically altered mastermind at gmail

17 years ago


Very handy to get a file extension:
$this->data['extension'] = substr($this->data['name'],strrpos($this->data['name'],'.')+1);

tsa at medicine dot wisc dot edu

19 years ago


What the heck, I thought I'd throw another function in the mix.  It's not pretty but the following function counts backwards from your starting point and tells you the last occurrance of a mixed char string:

<?php

function strrposmixed ($haystack, $needle, $start=0) {

  
// init start as the end of the str if not set

  
if($start == 0) {

      
$start = strlen($haystack);

   }
// searches backward from $start

  
$currentStrPos=$start;

  
$lastFoundPos=false;

  
   while(

$currentStrPos != 0) {

       if(!(
strpos($haystack,$needle,$currentStrPos) === false)) {

          
$lastFoundPos=strpos($haystack,$needle,$currentStrPos);

           break;

       }

      
$currentStrPos--;

   }

  
   if(

$lastFoundPos === false) {

       return
false;

   } else {

       return
$lastFoundPos;

   }

}

?>


info at qrworld dot net

8 years ago

pb at tdcspace dot dk

15 years ago


what the hell are you all doing. Wanna find the *next* last from a specific position because strrpos is useless with the "offset" option, then....

ex: find 'Z' in $str from position $p,  backward...

while($p > -1 and $str{$p} <> 'Z') $p--;

Anyone will notice $p = -1 means: *not found* and that you must ensure a valid start offset in $p, that is >=0 and < string length. Doh


purpleidea

16 years ago


I was having some issues when I moved my code to run it on a different server.
The earlier php version didn't support more than one character needles, so tada, bugs. It's in the docs, i'm just pointing it out in case you're scratching your head for a while.

tremblay dot jf at gmail dot com

9 years ago


I created an easy function that search a substring inside a string.
It reverse the string and the substring inside an strpos and substract the result to the length of the string.

if (!function_exists("real_strrpos")) {
   function real_strrpos($haystack,$needle) {
      $pos  = strlen($haystack);
      $pos -= strpos(strrev($haystack), strrev($needle) );
      $pos -= strlen($needle);
      return $pos;
   }
}


Using explode() without a limit will result in incorrect results. Some first and last names have spaces. For example:

$name = explode(" ","Jan Van Riebeck");
echo $name[0]." ".$name[1]; // Jan Van (incorrect)


$name = explode(" ","St. John Westcox");
echo $name[0]." ".$name[1]; // St. John (incorrect)

Use explode() with a limit (so it only returns 2 items), like so:

$name = explode(" ","Jan Van Riebeck",2);
echo $name[0]." ".$name[1]; // Jan Van Riebeck (correct)

This will still be incorrect some time, but more last names have spaces than first names. Ideally, if you’re capturing the form data, use two different fields for first and last name, but even this isn’t always ideal, some cultures have different ways that names work that aren’t as simple as first name last name.

Here is a list of common pitfalls when it comes to working with names

Обзор PHP-функций для работы со строками и практическое их применение с учетом кодировки UTF-8.

1

Количество символов

Получить длину строки

Функция strlen($string) возвращает длину строки, но возвращает неправильный результат если в строке есть кириллица в UTF-8, поэтому нужно использовать mb_strlen().

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';

echo strlen($text); // 105
echo mb_strlen($text); // 59

PHP

Количество символов без пробелов

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_ereg_replace('[s]', '', $text);
echo mb_strlen($str); // 49

PHP

Количество слов с строке

Функция str_word_count() возвращает количество слов в строке, но символы обрамленные пробелами будет считаться за слово, например « — ». Так же функция не работает с UTF-8, как видно в примере:

$text = 'Lorem Ipsum - is simply dummy!';
echo str_word_count($text); // 6

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo str_word_count($text); // 1

PHP

Рабочий вариант:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[[:punct:]]/", '', $text);
$str = mb_ereg_replace('[s]+', ' ', $str);
$words = explode(' ', $str);
echo count($words); // 10

PHP

Получить количество переносов в строке

$text = 'Съешь ещё - этих 
мягких французских булок, 
да выпей же чаю.';

echo substr_count($text, PHP_EOL); // 2

PHP

Количество букв в строке

$text = 'Съешь ещё этих мягких французских булок, да выпей же чаю.';
echo $str = preg_replace('/[^a-zа-яё]/ui', '', $text);
echo mb_strlen($str); // 46

PHP

Количество цифр в строке

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace('/[^0-9]/ui', '', $text);
echo mb_strlen($str); // 0

PHP

Количество знаков препинания

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[^[:punct:]]/", '', $text);
echo mb_strlen($str); // 3

PHP

Количество пробелов в строке

Или количество вхождений любого другого символа или подстроки.

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo substr_count($text, ' '); // 10

PHP

Количество пробелов в начале строки:

$text = '     Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strlen($text) - mb_strlen(ltrim($text, ' ')); // 5

PHP

Количество пробелов в конце строки:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.   ';
echo mb_strlen($text) - mb_strlen(rtrim($text, ' ')); // 3

PHP

2

Поиск

Получить количество вхождений подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_substr_count($text, 'ещё'); // 2

PHP

Найти позицию первого вхождения подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strpos($text, 'ещё'); // 6

// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_stripos($text, 'ещё'); // 6

PHP

Найти позицию последнего вхождения подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strrpos($text, 'ещё'); // 46

// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strirpos($text, 'ещё'); // 46

PHP

Найти все вхождения подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';

$offset = 0;
$allpos = array();
while (($pos = mb_strpos($text, 'ещё', $offset)) !== false) {
	$offset   = $pos + 1;
	$allpos[] = $pos;
}

print_r($allpos); // Array ([0] => 6 [1] => 46)

PHP

3

Извлечение из текста

Начало строки

Получить первый символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 1); // С

PHP

Получить три первых символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 3); // Съе

PHP

Получить первое слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', true); // Съешь

PHP

Получить все после первого слова:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', false); // ещё - этих мягких французских булок, да выпей же чаю.

PHP

Конец строки

Получить последний символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 1); // .

PHP

Получить три последних символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 3); // аю.

PHP

Получить последнее слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo end($array); // чаю.

PHP

Получить всё до последнего слова:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $str; // Съешь ещё - этих мягких французских булок, да выпей же

PHP

Середина строки

Получить второе слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo $array[1]; // ещё

PHP

Получить текст до дефиса:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, mb_strpos($text, ' - ')); // Съешь ещё

PHP

Получить текст после дефиса:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, mb_strpos($text, ' - ') + mb_strlen(' - '), -1);
echo $str; // этих мягких французских булок, да выпей же чаю

PHP

Переносы строк

Получить первую строку:

$text = 'Разнообразный опыт укрепление и развитие структуры требуют 
определения направлений прогрессивного развития! Не следует забывать, 
что постоянный рост и сфера активности в  степени обуславливает создание 
системы обучения кадров? С другой стороны дальнейшее развитие различных 
форм влечет за собой процесс внедрения и модернизации.';

$pos = mb_strpos($text, "n");
$str = trim(mb_substr($text, 0, $pos));
echo $str; // Разнообразный опыт укрепление и развитие структуры требуют 

// или
$lines = explode("n", $text);
echo $lines[0]; // Разнообразный опыт укрепление и развитие структуры требуют 

PHP

Получить последнюю строку:

$text = 'Разнообразный опыт укрепление и развитие структуры требуют 
определения направлений прогрессивного развития! Не следует забывать, 
что постоянный рост и сфера активности в  степени обуславливает создание 
системы обучения кадров? С другой стороны дальнейшее развитие различных 
форм влечет за собой процесс внедрения и модернизации.';

$pos = mb_strrpos($text, "n");
$str = trim(mb_substr($text, $pos));
echo $str; // форм влечет за собой процесс внедрения и модернизации.

// или
$lines = explode("n", $text);
echo end($lines); // форм влечет за собой процесс внедрения и модернизации.

PHP

Пилучить символы из ковычек и скобок

$text = ''Съешь' "ещё" «этих» [мягких] (французских) {булок} <да>';

// '...'
preg_match_all("/'(.+?)'/", $text, $matches);
echo $matches[1][0]; // Съешь

// "..."
preg_match_all("/"(.+?)"/", $text, $matches);
echo $matches[1][0]; // ещё

// «...»
preg_match_all("/«(.+?)»/", $text, $matches);
echo $matches[1][0]; // этих

// [...]
preg_match_all("/[(.+?)]/", $text, $matches);
echo $matches[1][0]; // мягких

// (...)
preg_match_all("/((.+?))/", $text, $matches);
echo $matches[1][0]; // французских

// {...}
preg_match_all("/{(.+?)}/", $text, $matches);
echo $matches[1][0]; // булок

// <...>
preg_match_all("/<(.+?)>/", $text, $matches);
echo $matches[1][0]; // да

PHP

4

Замена в строках

Функция substr_replace($search, $replace, $subject, $count) – заменяет часть строки, также не раотает с кирилицей в кодировке UTF-8, в библиатеке mb_string её нет, поэтому приходится использовать пользовольскую функцию:

if (!function_exists('mb_substr_replace')) {
	function mb_substr_replace($original, $replacement, $position, $length)
	{
		$startString = mb_substr($original, 0, $position, 'UTF-8');
		$endString = mb_substr($original, $position + $length, mb_strlen($original), 'UTF-8');
		$out = $startString . $replacement . $endString;
		return $out;
	}
}

PHP

Заменить первый символ:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', 0, 1); // !ъешь ещё - этих мягких французских булок.

PHP

Заменить три первых символа:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', 0, 3); // !!!шь ещё - этих мягких французских булок.

PHP

Заменить последний символ:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', -1, 0); // Съешь ещё - этих мягких французских булок!

PHP

Заменить три последних символа:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', -3, 0); // Съешь ещё - этих мягких французских бул!!!

PHP

Замена символов и слов в строке

Для этой задачи подходит функция str_replace($search, $replace, $subject), которая работает со всеми кодировками.

Заменить пробелы:

$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace(' ', '-', $text); // Съешь-ещё---этих-мягких-французских-булок.

PHP

Заменить слово:

$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace('мягких', 'твердых', $text); // Съешь ещё - этих твердых французских булок.

PHP

Заменить всё до дефиса:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = 'Не ешь' . mb_substr($text, mb_strpos($text, ' - '), -1);
echo $str; // Не ешь - этих мягких французских булок

PHP

Заменить всё после дефиса:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = mb_substr($text, 0, mb_strpos($text, ' - ') + 3) . 'печенек';
echo $str; // Съешь ещё - печенек

PHP

5

Добавление в строки

Добавить строку после 10-го символа:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = mb_substr_replace($text, '!!!', 10, 0);
echo $str; // Съешь ещё !!!- этих мягких французских булок.

PHP

Добавить перед словом:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = str_replace(' ещё ', ' же ещё ', $text); 
echo $str; // Съешь же ещё - этих мягких французских булок.

PHP

Добавить после слова:

$text = 'Съешь ещё - этих мягких французских булок.';
$str = str_replace(' ещё ', ' ещё немного ', $text); 
echo $str; // Съешь ещё немного - этих мягких французских булок.

PHP

Вставить строку между всех символов

Для того чтобы вставить символ между всех символов в строке понадобится функция str_split($string) для пробразавания строки в массив, она также не работает с кирилицей. С версии PHP 7.4 появилась функция mb_str_split(), для более ранних версий:

if (!function_exists('mb_str_split')) {
	function mb_str_split($str, $l = 0) {
		if ($l > 0) {
			$ret = array();
			$len = mb_strlen($str, "UTF-8");
			for ($i = 0; $i < $len; $i += $l) {
				$ret[] = mb_substr($str, $i, $l, "UTF-8");
			}
			return $ret;
		}
		return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
	}
}

PHP

$text = 'Съешь ещё - этих мягких французских булок.';

$array = mb_str_split($text);;
$new = implode(' ', $array);
echo $new; // С ъ е ш ь   е щ ё   -   э т и х   м я г к и х   ф р а н ц у з с к и х   б у л о к .

PHP

Дописать строку до нужной длины

Функция str_pad($string, $length, $pad_string, $pad_type) дополняет строку другой строкой до заданной длины.

Версия функции для UTF-8:

if (!function_exists('mb_str_pad')) {
	function mb_str_pad($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT)
	{
		$diff = strlen($input) - mb_strlen($input);
		return str_pad($input, $pad_length + $diff, $pad_string, $pad_type);
	}
}

PHP

Дописать стркуку слева:

$text = 'Привет Мир';
echo mb_str_pad($text,  20, '-', STR_PAD_LEFT); // ----------Привет Мир

PHP

Дописать строку справа:

$text = 'Привет Мир';
echo mb_str_pad($text,  20, '-', STR_PAD_RIGHT); // Привет Мир----------

PHP

Дописать строку с обеих сторон:

$text = 'Привет Мир';
echo mb_str_pad($text,  20, '-', STR_PAD_BOTH); // -----Привет Мир-----

PHP

6

Удаление из строк

Удаление в начале строки

Удалить первый символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 1);
echo $new; // ъешь ещё - этих мягких французских булок, да выпей же чаю.

PHP

Удалить первые 3 символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 3);
echo $new; // шь ещё - этих мягких французских булок, да выпей же чаю.

PHP

Удалить первое слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, mb_strpos($text, ' '));
echo $new; // ещё - этих мягких французских булок, да выпей же чаю.

PHP

Удаление в конце строки

Удалить последний символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -1);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же чаю

PHP

Удалить три последних символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -3);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же ч

PHP

Удалить последнее слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же

PHP

Удаление подсторк

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = str_replace(' мягких', '', $text);
echo $new; // Съешь ещё - этих французских булок, да выпей же чаю.

PHP

Удалить всё перед сиволом:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-'); 
echo $new; // - этих мягких французских булок, да выпей же чаю.

PHP

Удалить всё после сивола:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-', true); 
echo $new; // Съешь ещё

// Второй вариант:
$pos = mb_strpos($text, '-');
$new = mb_substr($text, 0, $pos + 1);
echo $new; // Съешь ещё -

PHP

  • Вопросы по программированию на JavaScript

    JavaScript изначально создавался для того, чтобы сделать web-странички «живыми». Программы на этом языке называются скриптами. В браузере они подключаются напрямую к HTML и, как только загружается страничка – тут же выполняются.

    1. JavaScript
    2. примеры
  • Вопросы по программированию на PHP

    PHP ( Hypertext Preprocessor )— препроцессор гипертекста» — скриптовый язык общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков, применяющихся для создания динамических веб-сайтов

    1. PHP
    2. Примеры
  • PHP Class сжатия HTML кода без потери работоспособности
    1. PHP
    2. HTML
    3. Примеры
  • Redirection 3xx. Редиректы
    1. PHP
    2. Редиректы
    3. Примеры
  • Адаптивное видео по ширине экрана

    Для того чтобы видео растягивалось до размеров родительского блока, достаточно в таблице стилей CSS, прописать

    1. CSS
    2. Примеры
  • Обработка строк

    Курс PHP для начинающих

    • PHP и MySQL
    • Основы PHP
    • Обработка строк

    Внимание! Данный курс устарел!
    Переходите к новому курсу «PHP для начинающих».

    Безусловно, изображения, звуковые файлы, видеоинформация, анимационные данные и аплеты составляют важную часть информационного наполнения World Wide Web, но подавляющая часть данных в веб все еще представлена в виде текста — последовательностей символов, подобных данному предложению. Основным типом данных PHP, предназначенным для представления текста, является строка.

    Курс PHP для начинающих

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

    Код PHP

    $my_string = 'Простая строка';
    $another_string = "Еще одна строка";

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

    Например, после обработки следующего кода, входящего в состав веб-страницы:

    Код PHP

    $count = 13;
    
    $string_1 = "В строке "Hello, world!" $count символов.<br>";
    $string_2 = 'В строке 'Hello, world!' $count символов.<br>';
    
    echo $string_1;
    echo $string_2;

    можно рассчитывать на получение в окне браузера такого вывода:

    Обработка интерпретатором PHP строк с одинарными и двойными кавычками

    Подстановка значений с использованием фигурных скобок

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

    Первая ситуация состоит в том, что интерпретатор не может определить, где оканчивается имя переменной, а вторая ситуация возникает, когда необходимо подставить в строку не значение простой переменной, а значение выражения. В этих случаях разработчик может внести ясность, заключив имя или выражение, подлежащее обработке, в фигурные скобки ({}).

    Например, интерпретатор PHP не испытывает затруднений при обработке следующего кода:

    Код PHP

    $sport = 'волейбол';
    $play = "Я люблю играть в $sport.";

    В таких случаях интерпретатор обнаруживает символ $, после чего начинает собирать символы в подстроку для выявления имени переменной и выполняет такую сборку до тех пор, пока не встретится пробел или точку, которые следуют за именем переменной $sport. Пробелы и точки не могут входить в состав имени переменной, поэтому становится ясно, что рассматриваемая переменная имеет имя $sport; после этого интерпретатор PHP успешно находит значение для данной переменной (‘волейбол’) и подставляет его.

    Но иногда не существует возможности обозначить конец имени переменной с помощью пробела или точки. Рассмотрим следующий пример:

    Код PHP

    $sport_1 = 'волей';
    $sport_2 = 'фут';
    $sport_3 = 'баскет';
    
    // Неправильные конструкции
    $play_1 = "Я люблю играть в $sport_1бол.";
    $play_2 = "Я люблю играть в $sport_2бол.";
    $play_3 = "Я люблю играть в $sport_3бол.";

    В данном случае не будет достигнут желаемый эффект, поскольку интерпретатор PHP будет рассматривать строку $sport_1 как часть имени переменной $sport_1бол, которой, по всей видимости, не присвоено какое-либо значение. Вместо этого необходимо применять такую запись:

    Код PHP

    // Правильная конструкция
    $play_1 = "Я люблю играть в {$sport_1}бол.";
    $play_2 = "Я люблю играть в {$sport_2}бол.";
    $play_3 = "Я люблю играть в {$sport_3}бол.";

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

    По аналогичным причинам интерпретатор PHP, если не используются фигурные скобки, сталкивается с затруднениями при подстановке значений сложных выражений с именами переменных, наподобие обращений к элементам многомерных массивов и к объектным переменным. Общее правило состоит в том, что если за открывающей фигурной скобкой ({) непосредственно следует символ $, то интерпретатор PHP вычисляет значение выражения с именем переменной вплоть до закрывающей фигурной скобки (}), а затем подставляет результирующее значение в строку. (Если требуется, чтобы в строке появилось литеральное значение {$, это можно обеспечить, поставив перед каждым из этих символов обратную косую черту, ).

    Символы и индексы символов в строках

    В отличие от некоторых других языков программирования в языке PHP нет отдельного символьного типа, не совпадающего со строковым типом. Вообще говоря, функции, которые требуют в других языках применения символьных фактических параметров, в языке PHP рассчитаны на получение строк с длиной 1.

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

    Код PHP

    $my_string = "Doubled";
    
    for ($index = 0; $index < strlen($my_string); $index++)
    { 
        $char = $my_string{$index}; 
    	print("$char$char");
    }

    приводит к получению в окне браузера такого вывода:

    Обработка символов в строке

    Очевидно, что при каждом проходе по циклу каждый символ строки выводится дважды. Функция strlen() возвращает длину строки.

    Операции со строками

    В языке PHP предусмотрены две строковые операции: операция со знаком операции точка (.), или операция конкатенации, и операция со знаком операции точка и знак равенства (.=), или операция конкатенации и присваивания. Рассмотрим следующий пример:

    Код PHP

    $string_1 = "Это часть";
    $string_2 = "строки";
    
    // Конкатенация строк
    echo $string_1." простой ".$string_2."<br>";     // "Это часть простой строки"
    
    // Конкатенация и присваивание
    $string_1 .= " простой ";       // Эквивалентно $string_1 = $string_1." простой "; 
    $string_1 .= $string_2;
    echo $string_1;                 // "Это часть простой строки"

    Следует отметить, что в приведенном выше примере первому оператору echo не передается несколько строковых фактических параметров; передается только один строковый фактический параметр, созданный в результате конкатенации четырех строк. Первая и третья строки заданы с помощью переменных, а вторая и четвертая строки представляют собой литеральную строку, заключенную в двойные кавычки.

    Синтаксическая структура вложенного документа (Heredoc)

    Кроме синтаксических структур строк в одинарных и двойных кавычках, в языке PHP предусмотрен еще один способ задания строки, называемый синтаксической структурой вложенного документа (Heredoc). Как оказалось, подобная синтаксическая структура является весьма удобным средством задания больших фрагментов текста, подставляемого с помощью переменных, поскольку избавляет пользователя от необходимости обозначать внутренние кавычки с помощью специальных символов. Такой способ особенно удобен при создании страниц, которые содержат формы HTML.

    Знаком операции, применяемом в синтаксической структуре вложенного документа, является (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

    Рассмотрим следующий пример:

    Код PHP

    $string = <<<EOT
    <form method="post" action="{$_SERVER['PHP_SELF']}">
        <input type="text" name="login" placeholder="Введите имя..."><br>
    	<input type="password" name="password" placeholder="Введите пароль..."><br>
    	<input type="submit" value="Отправить">
    </form>
    EOT;
    
    echo $string;

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

    Подстановка значений переменных осуществляется с использованием точно такого же способа, как и при использовании строк, заключенных в двойные кавычки. Удобной особенностью вложенного документа является то, что в обозначаемый таким образом текст можно вводить знаки кавычек без применения каких-либо управляющих символов, и это не приводит к преждевременному завершению формирования строки. Пример, показанный выше, выводит простейшую HTML-форму:

    Использование heredoc-синтаксиса для вывода формы

    Курс PHP для начинающих

    Строковые функции

    В языке PHP предусмотрено большое количество разнообразных функций для обработки и преобразования строк. Если у вас когда-либо возникнет необходимость создать собственную функцию, которая читает и обрабатывает строки символ за символом, чтобы сформировать новую строку, вначале подумайте, не могла ли аналогичная задача возникнуть перед кем-либо раньше. А если интуиция подсказывает, что такая вероятность существует, то, возможно, имеется и встроенная функция, которая решает поставленную задачу. Для получения дополнительной информации о строковых функциях обратитесь по адресу php.net/manual/ru/ref.strings.php.

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

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

    На какие вопросы, касающиеся строк, чаще всего приходится искать ответ? Первым в списке вопросов является вопрос о том, какую длину имеет строка; для ответа на него используется функция strlen(), имя которой является сокращением от string length — длина строки. Пример применения такой функции приведен ниже:

    Код PHP

    $en_str = "Hello world!";
    $rus_str = "Простая строка";
    
    echo $en_str." - ".strlen($en_str)." символов<br>";
    echo $rus_str." - ".strlen($rus_str)." символов";

    Выполнение этого кода приводит к получению следующего неоднозначного вывода:

    Функция strlen()

    Как видите, для строки «Hello world!» результат получился правильным, но для строки «Простая строка» результат в 27 символов является неверным. В чем же тут дело? Дело в том, что функция strlen() считает именно байты, а не символы. В первом случае все символы в строке являются англоязычными, т.е. представлены кодировкой ASCII и кодируются 1 байтом. Во втором случае в строке есть русские символы, которые кодируются 2 байтами (UTF-8). Чтобы избежать проблем в дальнейшем при работе со строковыми функциями, в PHP следует использовать функции для многобайтных кодировок, начинающихся с префикса mb_. Это значит, что в предыдущем примере надо заменить функцию strlen() на mb_strlen() и явно указать кодировку:

    Код PHP

    ...
    echo $rus_str." - ".mb_strlen($rus_str, 'UTF8')." символов";

    Поиск символов и подстрок

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

    Код PHP

    $en_str = "Hello world!";
    
    echo "Символ 'l': ".strpos($en_str, 'l');   // 2

    Ситуации, связанные с применением функции strpos(), относятся к тем случаям, в которых невосприимчивость языка PHP к типам может стать источником проблем. Если соответствие не найдено, то функция возвращает ложное значение, а если искомый символ совпадает с самым первым символом в строке, то функция возвращает 0 (поскольку отсчет позиций символов в строке начинается с 0, а не с 1). Оба эти значения соответствуют ложному значению при использовании для проверки логического условия. Один из способов, позволяющих различить эти значения, состоит в применении операции сравнения на идентичность (операции ===, введенной начиная с версии PHP4), которая возвращает истинное значение, только если ее операнды являются одинаковыми и относятся к одному и тому же типу. Операцию сравнения на идентичность можно использовать для проверки того, равно ли возвращаемое значение 0 (или имеет значение false), без риска спутать возвращаемое значение с другими значениями, которые могут стать одинаковыми с ним после приведения типа.

    Функция strpos() может также использоваться для поиска подстроки, а не одного символа. Для этого достаточно задать в качестве искомой многосимвольную, а не односимвольную строку. Кроме того, в вызове этой функции можно задать дополнительный целочисленный параметр, который указывает позицию начала поиска.

    Возможен также поиск в обратном направлении, от конца строки к началу. Для этого используется функция strrpos() [mb_strrpos]. (Обратите внимание на то, что в имени этой функции есть дополнительная буква r, которая является сокращением от слова reverse — обратный.) Эта функция принимает в качестве параметров строку, в которой должен выполняться поиск, и искомую односимвольную строку, после чего возвращает последнюю позицию вхождения второго параметра в первый параметр. (В отличие от функции strpos() в функции strrpos() искомая строка должна состоять только из одного символа.) После применения этой функции с теми же параметрами, что и в предыдущем примере, будет найдена другая позиция:

    Код PHP

    $en_str = "Hello world!";
    
    echo "Символ 'l': ".strrpos($en_str, 'l');   // 9 т.к. поиск ведется с конца строки

    Сравнение

    Совпадает ли та строка с этой строкой? По-видимому, в коде часто приходится искать ответ также и на этот вопрос, особенно когда приходится обрабатывать входные данные, введенные конечным пользователем.

    Простейший метод поиска ответа на вопрос о том, являются ли строки одинаковыми, состоит в использовании простой операции сравнения на равенство (==), которая обеспечивает проверку на равенство не только строк, но и чисел. При использовании операции == две строки рассматриваются как одинаковые, если содержат полностью одинаковые последовательности символов. При этом не выполняется проверка на соблюдение более строгого определения одинаковых строк, например, того условия, что эти строки хранятся по одному и тому же адресу в памяти, но учитывается регистр букв (иными словами, учитывается то, являются ли сравниваемые буквы прописными или строчными).

    Результатам сравнения двух строк с использованием операции == (или соответствующих операций < и >) можно доверять, только если оба операнда являются строками и известно, что не производилось какое-либо преобразование типов. А результатам проверки с помощью функции strcmp(), которая описана ниже, можно доверять всегда.

    Наиболее важной функцией сравнения строк, с помощью которой выполняется основной объем работы, является strcmp(). Эта функция принимает две строки в качестве параметров и сравнивает байт за байтом, пока не обнаружит различие. После этого функция возвращает отрицательное число, если первая строка меньше второй, и положительное число, если вторая строка меньше первой. Если строки идентичны, функция strcmp() возвращает ноль.

    Функция strcasecmp() действует по такому же принципу, за исключением того, что при сравнении на равенство не учитывается регистр букв. Например, вызов функции strcasecmp(«hey!», «HEY!») должен возвратить нуль.

    Поиск

    Только что описанные функции сравнения позволяют узнать, равна ли одна строка другой строке. А для определения того, содержится ли одна строка в другой, используется функция strpos(), описанная выше, или функция strstr() и подобные ей функции.

    Функция strstr() [mb_strstr()] принимает в качестве параметров строку, в которой должен быть выполнен поиск, и искомую строку (в указанном порядке). В случае успеха данная функция возвращает часть строки, которая начинается с первого вхождения искомой строки (и включает искомую строку). Если такая строка не найдена, функция возвращает ложное значение. В следующем фрагменте кода приведены примеры применения этой функции:

    Код PHP

    $str = "Привет мир!";
    $find_str = "мир";
    
    echo "Подстрока '<b>$find_str</b>' в исходной строке: ".strstr($str, $find_str);

    Так же как и функция strcmp(), функция strstr() имеет версию, нечувствительную к регистру, которая имеет имя stristr() [mb_stristr] (буква i в этом имени является сокращением от слова insensitive — нечувствительный). Функция stristr() идентична функции strstr() во всех отношениях, за исключением того, что при сравнении строчные буквы рассматриваются как прописные аналоги.

    Выборка подстроки

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

    Наиболее простой способ выборки части строки состоит в применении функции substr() [mb_substr()], которая возвращает новую строку, содержащую часть подпоследовательности символов из старой строки. В качестве параметров функция substr() принимает строку (из которой осуществляется выборка подстроки), целое число (позиция, с которой начинается требуемая подстрока) и необязательный целочисленный третий параметр, который задает длину требуемой подстроки. Если третий параметр не задан, то подразумевается, что подстрока продолжается до конца строки. (Следует помнить, что и при использовании этой функции нумерация позиций в строке начинается с нуля, а не с единицы, как и во всех параметрах функций PHP, которые обозначают числовые позиции в строках.) Например:

    Код PHP

    $str = "Привет мир!";
    
    echo mb_substr($str, 7, 3, 'UTF8');   // "мир"

    И параметр с обозначением начальной позиции, и параметр с обозначением длины могут быть отрицательными, но в обоих этих случаях отрицательное значение имеет разный смысл. Если отрицательной является начальная позиция, то позиция начального символа подстроки определяется путем обратного отсчета от конца строки, а не прямого отсчета от начала строки. (Начальная позиция, равная -1, указывает, что отсчет начинается с последнего символа, значение —2 указывает на предпоследний символ и т.д.)

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

    Ниже приведены некоторые примеры с положительными и отрицательными параметрами:

    Код PHP

    $str = "Привет мир!";
    
    echo mb_substr($str, 7, 3, 'UTF8')."<br>";    // "мир"
    echo mb_substr($str, -4, 3, 'UTF8')."<br>";   // "мир"
    echo mb_substr($str, 0, -5, 'UTF8')."<br>";   // "Привет"

    Удаление пробелов и символов табуляции из строк

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

    Кроме пробелов, эти функции удаляют другие пробельные символы, подобные тем, которые обозначаются с помощью управляющих последовательностей, n, r, t и (символов обозначения конца строки, знаков табуляции и нуль-символов, используемых для обозначения конца строки в программах на языке C).

    В языке PHP обычно принято применять функцию удаления пробельных символов в конце строки с именем chop(), но может быть также вызвана идентичная функция, имеющая более выразительное имя rtrim(). Наконец, следует отметить, что функция chop(), несмотря на то, что ее имя, которое означает «отрубить», звучит очень грозно, не повреждает исходный параметр $original, который сохраняет предыдущее значение.

    Замена строк

    Все рассмотренные выше функции для работы со строками обеспечивали выборку части входного параметра, а не формирование полностью новой строки. В данном разделе рассматриваются функции str_replace() и substr_replace(), предназначенные для этой цели.

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

    Код PHP

    $str = "Привет мир!";
    
    echo str_replace("мир", "планета", $str);   // "Привет планета!"

    Замена выполняется применительно ко всем вхождениям подстроки, найденным в строке поиска. Если бы приведенный выше пример применялся для замены названия города в устаревшей энциклопедии, то после преобразования всего текста энциклопедии в единственную строку PHP такую замену во всем тексте можно было бы выполнить за один проход.

    Как было показано выше, функция str_replace() выбирает часть исходной строки, подлежащую замене, отыскивая вхождения искомой подстроки в исходной строке; в отличие от этого функция substr_replace() выбирает часть, подлежащую замене, по ее абсолютной позиции. Эта функция принимает до четырех параметров: строка, в которой должна быть выполнена замена, строка, применяемая в качестве замены, начальная позиция замены и (в качестве необязательного параметра) длина заменяемой части строки. Рассмотрим следующий пример:

    Код PHP

    echo substr_replace("ABCDEFG", "-", 2, 3);   // "AB-FG"

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

    Функция substr_replace() принимает также отрицательные параметры в качестве обозначения начальной позиции и длины, которые трактуются точно так же, как в функции substr(), которая описана выше. Важно помнить, что в результате операций, выполняемых с помощью функций str_replace и substr_replace, исходная строка остается неизменной.

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

    Код PHP

    echo str_repeat("ABC", 3);    // ABCABCABC

    Функции преобразования регистра букв

    Эти функции позволяют преобразовывать строчные буквы в прописные и наоборот. Функция strtolower() [mb_strtolower()] возвращает строку, в которой все буквы преобразованы в строчные. При этом не имеет значения, содержала ли исходная строка исключительно прописные буквы или прописные и строчные. Например:

    Код PHP

    $str = "Привет мир!";
    
    echo mb_strtolower($str, 'UTF8');   // "привет мир!"

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

    Функция strtoupper() [mb_strtoupper()] возвращает строку, в которой все буквы преобразованы в прописные. В качестве примера можно привести следующий фрагмент кода:

    Код PHP

    $str = "Привет мир!";
    
    echo mb_strtoupper($str, 'UTF8');   // "ПРИВЕТ МИР!"

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

    Функции введения управляющих символов

    Одним из преимуществ языка PHP является то, что он может применяться дня обмена данными почти с любой системой. Средства подобного рода принято рассматривать как своего рода «программный клей». В этой роли язык PHP применяется для взаимодействия с серверами баз данных, серверами LDAP, для обмена данными через сокеты и само соединение HTTP. Зачастую такое взаимодействие осуществляется путем предварительного создания строки сообщения (наподобие запроса к базе данных), а затем передачи этого сообщения в программу-получатель. Но в программах часто придается особый смысл некоторым символам, и поэтому их приходится преобразовывать в управляющие символы. Это означает, что программе-получателю дается указание рассматривать подобные символы как литеральную часть строки, а не применять к ним специальную обработку.

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

    Функция addslashes() преобразует одинарные и двойные кавычки, символы обратной косой черты и нуль-символы в управляющие последовательности с помощью символов обратной косой черты, поскольку именно указанные символы обычно приходится преобразовывать в управляющие последовательности при подготовке запросов к базам данных:

    Код PHP — абстрактный пример

    $escapedstring = addslashes("Строка с 'кавычками'.");
    $query = "INSERT INTO test (quote) values ('$escapedstring')";
    
    $result = mysqli_query($link, $query) or die(mysql_error());

    Выполнение этого кода позволяет предотвратить ошибочную интерпретацию оператора SQL, при которой строка рассматривалась бы как заканчивающаяся прямо перед буквой ‘к’. А после выборки этих данных необходимо воспользоваться функцией stripslashes() для удаления символов обратной косой черты.

    Функция quotemeta() преобразует в управляющие последовательности более широкий набор символов. Все эти символы обычно имеют особый смысл в командной строке Unix: » . «, » ‘ «, » + «, » * «, » ? «, » [ «, » ] «, » ^ «, » ( «, » $ » и » )». Например, выполнение следующего кода:

    Код PHP

    $str = "Эти символы ($, *, ^) нужно преобразовать.";
    
    echo quotemeta($str);

    выводит такую строку:

    Использование функции quotemeta()

    Функции вывода на внешнее устройство и в строку

    Основными конструкциями, применяемыми для вывода, являются print и echo, которые подробно рассматривались ранее. Стандартный способ вывода значений переменных на внешнее устройство состоит в том, чтобы включить имена этих переменных в строку с двойными кавычками (при обработке которой интерпретатором происходит подстановка значений переменных), а затем передать эту строку в конструкцию print или echo.

    Если требуется еще более точно отформатированный вывод, то можно воспользоваться предоставляемыми языком PHP функциями printf() и sprintf(). Эти две функции принимают одинаковые параметры: специальную строку формата, за которой следует произвольное количество других параметров, подставляемых в нужные места в строке формата для получения результата. Единственное различие между функциями printf() и sprintf() состоит в том, что printf() отправляет результирующую строку непосредственно на внешнее устройство, применяемое для вывода, a sprintf() возвращает результирующую строку в качестве результата своего выполнения.

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

    Основная сложность, связанная с использованием этих функций, состоит в правильном определении строки формата. Каждый символ, находящийся в строке формата, появляется в результирующем значении в непосредственном виде, за исключением символов % и символов, которые сразу же следуют за этими символами. Символ % обозначает начало спецификации преобразования, которая указывает, как вывести на внешнее устройство один из параметров, который следует за строкой формата.

    После знака % находятся пять элементов, входящих в состав спецификации преобразования, которые описаны ниже, причем некоторые из них являются необязательными: заполнение, выравнивание, минимальная ширина, точность и тип:

    • Для указания на то, является ли число отрицательным, применяется необязательное обозначение в виде знака «минус» (-).

    • Единственный (необязательный) символ заполнения представляет собой либо 0, либо пробел ( ). Этот символ используется для заполнения любого пространства, которое при его отсутствии осталось бы незаполненным, но на выделении которого настаивал пользователь (задавая слишком большое значение параметра минимальной ширины). Если этот символ заполнения не задан, то по умолчанию происходит заполнение пробелами.

    • Необязательный символ выравнивания (-) показывает, должно ли выводимое значение быть выровнено по левому или по правому краю. Если этот символ задан, то значение будет выровнено по левому краю, а при его отсутствии применяется выравнивание по правому краю.

    • Необязательное числовое значение минимальной ширины, которое указывает, какое минимальное количество позиций должно занимать выводимое значение. (Если для вывода значений требуется больше символьных позиций, чем указано, то выводимое значение выходит за эти пределы.)

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

    • Единственный символ, указывающий, как должен интерпретироваться тип значения. Символ f указывает, что значение должно быть выведено как число с плавающей точкой двойной точности, символ s указывает, что вывод значения должен осуществляться в виде строкового, а остальные возможные символы (b, c, d, o, x, X) говорят о том, что значение должно интерпретироваться как целочисленное и выводиться в различных форматах. Этими форматами являются b, который обозначает вывод в формате двоичных чисел, c — обусловливающий вывод символа с соответствующим значением кода ASCII, o — который требует вывода в формате восьмеричных чисел, x — для вывода в формате шестнадцатеричных чисел (с буквенными обозначениями цифр в нижнем регистре), и X — для вывода шестнадцатеричных чисел, в которых в качестве буквенных обозначений цифр используются прописные буквы.

    Ниже приведен пример вывода одного и того же числа с плавающей точкой двойной точности несколькими разными способами:

    Код PHP

    <pre>
    <?php
    	
    $value = 3.14159;
    printf ("%f<br> %10f<br> %-10f<br> %2.2f", $value, $value, $value, $value);
    
    ?>
    </pre>

    Он приводит к получению таких результатов:

    Использование форматированных строк с помощью функции printf()

    Применяемая в этом примере конструкция <pre>…</pre> представляет собой дескриптор HTML, который указывает браузеру, что заключенный в этот дескриптор блок должен форматироваться в буквальном виде, без сжатия нескольких пробелов в один и т.д.

    Функции для работы с кодом HTML

    В языке PHP предусмотрен целый ряд функций манипулирования со строками, содержащими данные, характерные для веб. Общие сведения об этих функциях приведены в таблице ниже:

    Строковые функции, предназначенные для работы с кодом HTML

    Функция Описание
    htmlspecialchars()

    Принимает в качестве параметра строку и возвращает строку, в которой четыре символа, имеющие специальное значение в языке HTML, заменены специальными строками. Каждый из этих символов заменяется соответствующим компонентом HTML, который после развертывания текста страницы в браузере снова заменяется первоначальным символом. Символ & заменяется компонентом &amp; символ » (символ двойной кавычки) — компонентом &quot; символ < — &lt; а символ > — &gt;

    htmlentities()

    Осуществляет более полную обработку по сравнению с htmlspecialchars(), т.е. заменяет компонентом HTML не только специальные символы, но и все символы, для которых предусмотрена замена компонентом HTML

    get_html_translation_table()

    Принимает одну из двух специальных констант (HTML_SPECIAL_CHARS или HTML_ENTITIES) и возвращает таблицу преобразования, используемую соответственно функциями htmlspecialchars() или htmlentities(). Таблица преобразования представляет собой массив, ключами которого являются символьные строки, а соответствующими значениями — строки, предназначенные для их замены

    nl2br()

    Принимает в качестве параметра строку и возвращает ту же строку, но с дескрипторами <br>, вставленным перед всеми символами обозначения конца строки (n, r или rn). Необходимость в использовании этой функции возникает, например, если требуется обеспечить такое же разбиение на абзацы текста, отображаемого в браузере, как и в исходное тексте

    strip_tags()

    Принимает в качестве параметра строку и выполняет все от нее зависящее для формирования строки, очищенной от всех дескрипторов HTML и всех дескрипторов PHP

    Хэширование данных с помощью алгоритма MD5

    Алгоритм MD5 представляет собой алгоритм обработки строк, который используется для выработки так называемого дайджеста, или цифровой подписи для любой строки, переданной в качестве параметра. Алгоритм формирует на основе входной строки строку постоянной длины, состоящую из 32 шестнадцатеричных цифр (0-9, a-f). Результаты, формируемые с помощью алгоритма MD5, обладают очень полезными свойствами, описанными ниже:

    • Алгоритм MD5 всегда обеспечивает формирование неизменной выходной строки при получении одной и той же входной строки, поэтому шифрование с помощью MD5 нельзя применять для хранения паролей.

    • Результаты применения алгоритма MD5 имеют фиксированную длину и очень равномерно распространены по всему диапазону возможных значений.

    • Может быть сформирована входная строка, соответствующая заданной выходной строке алгоритма MD5, или созданы две входные строки, обработка которых привела бы к получению одинаковой выходной строки, но лишь при определенных условиях.

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

    Код PHP

    $str = "Hello world!";
    echo "Хэш-код для строки '$str': <b>".md5($str)."</b><br>";
    
    $str = "Hello, world!";
    echo "Хэш-код для строки '$str': <b>".md5($str)."</b><br>";
    
    $str = "Hello world";
    echo "Хэш-код для строки '$str': <b>".md5($str)."</b><br>";

    приводит к получению в окне браузера таких результатов:

    Хеширование строк с помощью функции md5()

    Безусловно, в данном случае все входные строки весьма напоминают друг друга, но выходные строки не имеют какого-либо видимого сходства. Кроме того, диапазон возможных выходных значений является чрезвычайно огромным (1632), поэтому вероятность совпадения результатов обработки двух различных строк (при котором вырабатывалось бы одно и то же значение MD5) крайне мала.

    Благодаря указанным выше характерным особенностям алгоритма MD5 значения, полученные с его помощью, могут применяться для решения самых различных задач, включая описанные ниже:

    Вычисление контрольной суммы сообщения или файла

    Для проверки того, не произошло ли искажение сообщения во время передачи, можно передать вместе с сообщением дайджест MD5, а после получения сообщения снова сформировать дайджест MD5. Если две версии дайджеста не совпадают, значит, во время передачи были допущены искажения.

    Контроль над тем, остается ли содержимое файла неизменным

    Эта задача аналогична задаче вычисления контрольной суммы. Алгоритм MD5 часто используется для выполнения такой операции в машинах поиска, если требуется периодически осуществлять проверку того, изменилась ли веб-страница, и в случае необходимости выполнять переиндексацию. Дело в том, что для дальнейшей сверки гораздо проще организовать хранение дайджеста MD5, чем всего исходного файла.

    Разбиение множества строк или файлов на подмножества

    Для решения задачи разбиения множества строк на N случайно выбранных подмножеств можно вычислить дайджест MD5 каждой строки, взять первые несколько шестнадцатеричных символов, преобразовать их в число, получить остаток от деления этого числа по модулю на количество подмножеств N и использовать этот остаток в качестве номера подмножества, в которое должна быть записана эта строка.

    Кроме функции md5(), в языке PHP предусмотрена функция md5_file(), которая принимает в качестве параметра имя файла и возвращает хэшированное значение MD5, соответствующие содержимому файла.

    Функции, предназначенные для оценки подобия строк

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

    Если в качестве критерия оценки подобия рассматривается сходство в написании, то можно применить метрику Левенштейна. Функция levenshtein() принимает в качестве параметров две строки и возвращает данные о том, какое минимальное количество операций добавления, удаления и замены символов необходимо для преобразования одной строки в другую. Рассмотрим пример:

    Код PHP

    echo levenshtein('Tim', 'Time');    // 1
    echo levenshtein('boy', 'chefboyardee');    // 9
    echo levenshtein('never', 'clever');    // 2

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

    Функции синтаксического анализа и разбиения на лексемы

    Иногда возникает необходимость обеспечить в программе разбиение строк на компоненты, руководствуясь собственным определением того, что должно рассматриваться в качестве компонента. Процесс разделения длинной строки на части называют разбиением на лексемы. В частности, такой процесс входит в состав общей процедуры интерпретации или компиляции любой компьютерной программы, включая программу на языке PHP. В языке PHP для этой цели предусмотрена специальная функция — strtok().

    Функция strtok() принимает два параметра: строку, предназначенную для разбиения на лексемы, и строку, содержащую все разграничители (символы, которые рассматриваются как границы между лексемами). При первом вызове используются оба параметра и функция возвращает строковое значение, представляющее собой первую лексему. Для выборки последующих лексем выполняется такой же вызов, но параметр с исходной строкой исключается. Функция запоминает адрес строки, заданной в первом параметре, и использует ее в качестве текущей строки. Кроме того, эта функция запоминает, в каком месте была прекращена обработка при предыдущем вызове. Рассмотрим следующий пример:

    Код PHP

    $token = strtok("open-source HTML-embedded server-side Web scripting", " "); 
    
    while($token)
    {
    	echo $token."<br>"; 
    	$token = strtok(" ");
    }

    который приводит к получению в окне браузера такого вывода:

    Использование функции strtok()

    Разбиение исходной строки осуществляется в том месте, где находится каждый пробел.

    Функция strtok() формирует лексемы одну за другой. Можно также воспользоваться функцией explode(), которая выполняет примерно аналогичные действия, не считая того, что она сохраняет сразу все лексемы в одном массиве. После получения лексем, представленных в виде массива, с ними можно выполнять любые операции, включая сортировку.

    Функция explode() принимает два параметра: разделительную строку и строку, которая должна быть разделена на лексемы. Эта функция возвращает массив, каждый элемент которого представляет собой подстроку, находящегося между экземплярами разделителя в строке, подлежащей разделению. Рассмотрим следующий пример:

    Код PHP

    $explode_result = explode("AND", "one AND a two AND a three");

    который приводит к получению массива $explode_result, содержащего три элемента, каждый из которых представляет собой строку: «one «, » a two » и » a three». В данном конкретном примере не встречается ни одной прописной буквы в какой-либо из строк, содержащихся в массиве, поскольку разделитель AND не присутствует в результате.

    Разделительная строка, применяемая в функции explode(), в значительной степени отличается от строки с разграничителями, используемой в функции strtok(). Разделитель представляет собой полноценную строку, поэтому все символы этой строки должны быть найдены в исходной строке в том же порядке, что и в разделителе, чтобы можно было считать этот разделитель обнаруженным.

    С другой стороны, строка с разграничителями в функции strtok() задает множество отдельных символов, каждый из которых рассматривается как разграничитель. Это означает, что функция explode() действует более избирательно, но в большей степени подвержена нарушениям в работе. В частности, если в длинной строке будет случайно пропущен даже единственный пробел или символ обозначения конца строки, входящий в состав разделителя, то может быть нарушена вся работа этой функции.

    Функция explode() имеет обратную по отношению к ней функцию, implode(), которая принимает два параметра: соединительную строку (аналогичную разделительной строке в функции explode()) и массив строк, подобный тому, который возвращает функция explode(). Функция implode() возвращает строку, созданную путем вставки соединительной строки между всеми подряд идущими строковыми элементами в массиве.

    Функции

    Регулярные выражения

    Оценить статью:

    Понравилась статья? Поделить с друзьями:
  • Как исправить ошибку на oki
  • Как найти лапшу в андертейл
  • Как при помощи имей найти телефон
  • Как составить заявку на получение патента
  • Elite dangerous юридические услуги как найти