PHP has many functions to work with strings. The most commonly used
functions for searching and modifying strings are those that use regular
expressions to describe the string in question. The functions described in
this section do not use regular expressions—they are faster than regular
expressions, but they work only when you’re looking for a fixed string
(for instance, if you’re looking for "12/11/01"
rather than “any numbers separated by
slashes”).
If you know where the data that you are interested in lies
in a larger string, you can copy it out with the substr()
function:
$piece
=
substr
(
string
,
start
[,
length
]);
The start
argument is the position in
string
at which to begin copying, with
0
meaning the start of the string.
The length
argument is the number of
characters to copy (the default is to copy until the end of the string).
For example:
$name
=
"Fred Flintstone"
;
$fluff
=
substr
(
$name
,
6
,
4
);
// $fluff is "lint"
$sound
=
substr
(
$name
,
11
);
// $sound is "tone"
To learn how many times a smaller string occurs in a larger
one, use substr_count()
:
$number = substr_count(big_string
,small_string
);
For example:
$sketch
=
<<<
EndOfSketch
Well
,
there
'
s
egg
and
bacon
;
egg
sausage
and
bacon
;
egg
and
spam
;
egg
bacon
and
spam
;
egg
bacon
sausage
and
spam
;
spam
bacon
sausage
and
spam
;
spam
egg
spam
spam
bacon
and
spam
;
spam
sausage
spam
spam
bacon
spam
tomato
and
spam
;
EndOfSketch
;
$count
=
substr_count
(
$sketch
,
"spam"
);
(
"The word spam occurs
{
$count
}
times."
);
The
word
spam
occurs
14
times
.
The substr_replace()
function permits many kinds of string modifications:
$string = substr_replace(original
,new
,start
[,length
]);
The function replaces the part of
original
indicated by the
start
(0
means the start of the string) and length
values with the string new
. If no fourth
argument is given, substr_replace()
removes the text from start
to the end of the
string.
For instance:
$greeting
=
"good morning citizen"
;
$farewell
=
substr_replace
(
$greeting
,
"bye"
,
5
,
7
);
// $farewell is "good bye citizen"
Use a length
of 0
to insert without deleting:
$farewell
=
substr_replace
(
$farewell
,
"kind "
,
9
,
0
);
// $farewell is "good bye kind citizen"
Use a replacement of ""
to
delete without inserting:
$farewell
=
substr_replace
(
$farewell
,
""
,
8
);
// $farewell is "good bye"
Here’s how you can insert at the beginning of the string:
$farewell
=
substr_replace
(
$farewell
,
"now it's time to say "
,
0
,
0
);
// $farewell is "now it's time to say good bye"'
A negative value for start
indicates
the number of characters from the end of the string from which to start
the replacement:
$farewell
=
substr_replace
(
$farewell
,
"riddance"
,
−
3
);
// $farewell is "now it's time to say good riddance"
A negative length
indicates the number
of characters from the end of the string at which to stop deleting:
$farewell
=
substr_replace
(
$farewell
,
""
,
−
8
,
−
5
);
// $farewell is "now it's time to say good dance"
The strrev()
function
takes a string and returns a reversed copy of it:
$string = strrev(string
);
For example:
echo
strrev
(
"There is no cabal"
);
labac
on
si
erehT
The str_repeat()
function
takes a string and a count and returns a new string consisting of the
argument string
repeated
count
times:
$repeated = str_repeat(string
,count
);
For example, to build a crude wavy horizontal rule:
echo
str_repeat
(
'_.-.'
,
40
);
The str_pad()
function
pads one string with another. Optionally, you can say what string to pad
with, and whether to pad on the left, right, or both:
$padded = str_pad(to_pad
,length
[,with
[,pad_type
]]);
The default is to pad on the right with spaces:
$string
=
str_pad
(
'Fred Flintstone'
,
30
);
echo
"
{
$string
}
:35:Wilma"
;
Fred
Flintstone
:
35
:
Wilma
The optional third argument is the string to pad with:
$string
=
str_pad
(
'Fred Flintstone'
,
30
,
'. '
);
echo
"
{
$string
}
35"
;
Fred
Flintstone
.
.
.
.
.
.
.
.
35
The optional fourth argument can be STR_PAD_RIGHT
(the default), STR_PAD_LEFT
, or STR_PAD_BOTH
(to center). For example:
echo
'['
.
str_pad
(
'Fred Flintstone'
,
30
,
' '
,
STR_PAD_LEFT
)
.
"]
\n
"
;
echo
'['
.
str_pad
(
'Fred Flintstone'
,
30
,
' '
,
STR_PAD_BOTH
)
.
"]
\n
"
;
[
Fred
Flintstone
]
[
Fred
Flintstone
]
PHP provides several functions to let you break a string into
smaller components. In increasing order of complexity, they are explode()
, strtok()
, and sscanf()
.
Data often arrives as strings, which must be broken down
into an array of values. For instance, you might want to separate out
the comma-separated fields from a string such as "Fred,25,Wilma
."
In these situations, use the explode()
function:
$array = explode(separator
,string
[,limit
]);
The first argument, separator
, is a
string containing the field separator. The second argument,
string
, is the string to split. The
optional third argument, limit
, is the
maximum number of values to return in the array. If the limit is
reached, the last element of the array contains the remainder of the
string:
$input
=
'Fred,25,Wilma'
;
$fields
=
explode
(
','
,
$input
);
// $fields is array('Fred', '25', 'Wilma')
$fields
=
explode
(
','
,
$input
,
2
);
// $fields is array('Fred', '25,Wilma')
The implode()
function
does the exact opposite of explode()
—it creates a large string from an
array of smaller strings:
$string = implode(separator
,array
);
The first argument, separator
, is the
string to put between the elements of the second argument,
array
. To reconstruct the simple
comma-separated value string, simply say:
$fields
=
array
(
'Fred'
,
'25'
,
'Wilma'
);
$string
=
implode
(
','
,
$fields
);
// $string is 'Fred,25,Wilma'
The strtok()
function
lets you iterate through a string, getting a new chunk (token) each
time. The first time you call it, you need to pass two arguments: the
string to iterate over and the token separator. For example:
$firstChunk = strtok(string
,separator
);
To retrieve the rest of the tokens, repeatedly call strtok()
with only the separator:
$nextChunk = strtok(separator
);
For instance, consider this invocation:
$string
=
"Fred,Flintstone,35,Wilma"
;
$token
=
strtok
(
$string
,
","
);
while
(
$token
!==
false
)
{
echo
(
"
{
$token
}
<br />"
);
$token
=
strtok
(
","
);
}
Fred
Flintstone
35
Wilma
The strtok()
function returns
false
when there are no more tokens
to be returned.
Call strtok()
with two
arguments to reinitialize the iterator. This restarts the tokenizer
from the start of the string.
The sscanf()
function
decomposes a string according to a printf()
-like template:
$array = sscanf(string
,template
); $count = sscanf(string
,template
,var1
, ... );
If used without the optional variables, sscanf()
returns an array of fields:
$string
=
"Fred
\t
Flintstone (35)"
;
$a
=
sscanf
(
$string
,
"%s
\t
%s (%d)"
);
print_r
(
$a
);
Array
(
[
0
]
=>
Fred
[
1
]
=>
Flintstone
[
2
]
=>
35
)
Pass references to variables to have the fields stored in those variables. The number of fields assigned is returned:
$string
=
"Fred
\t
Flintstone (35)"
;
$n
=
sscanf
(
$string
,
"%s
\t
%s (%d)"
,
$first
,
$last
,
$age
);
echo
"Matched
{
$n
}
fields:
{
$first
}
{
$last
}
is
{
$age
}
years old"
;
Matched
3
fields
:
Fred
Flintstone
is
35
years
old
Several functions find a string or character within a larger
string. They come in three families: strpos()
and strrpos()
, which return a position; strstr()
, strchr()
, and friends, which return the string
they find; and strspn()
and strcspn()
, which return how much of the start
of the string matches a mask.
In all cases, if you specify a number as the “string” to search for, PHP treats that number as the ordinal value of the character to search for. Thus, these function calls are identical because 44 is the ASCII value of the comma:
$pos
=
strpos
(
$large
,
","
);
// find first comma
$pos
=
strpos
(
$large
,
44
);
// also find first comma
All the string-searching functions return false
if they can’t find the substring you
specified. If the substring occurs at the beginning of the string, the
functions return 0
. Because false
casts to the number 0
, always compare the return value with
===
when testing for failure:
if
(
$pos
===
false
)
{
// wasn't found
}
else
{
// was found, $pos is offset into string
}
The strpos()
function
finds the first occurrence of a small string in a larger
string:
$position
=
strpos
(
large_string
,
small_string
);
If the small string isn’t found, strpos()
returns false
.
The strrpos()
function
finds the last occurrence of a character in a string. It takes the
same arguments and returns the same type of value as strpos()
.
For instance:
$record
=
"Fred,Flintstone,35,Wilma"
;
$pos
=
strrpos
(
$record
,
","
);
// find last comma
echo
(
"The last comma in the record is at position
{
$pos
}
"
);
The
last
comma
in
the
record
is
at
position
18
The strstr()
function
finds the first occurrence of a small string in a larger string and
returns from that small string on. For instance:
$record
=
"Fred,Flintstone,35,Wilma"
;
$rest
=
strstr
(
$record
,
","
);
// $rest is ",Flintstone,35,Wilma"
The variations on strstr()
are:
stristr()
Case-insensitive
strstr()
strchr()
Alias for
strstr()
strrchr()
Find last occurrence of a character in a string
As with strrpos()
, strrchr()
searches backward in the string,
but only for a single character, not for an entire string.
If you thought strrchr()
was esoteric, you haven’t seen anything yet. The strspn()
and strcspn()
functions tell you how many
characters at the beginning of a string are composed of certain
characters:
$length = strspn(string
,charset
);
For example, this function tests whether a string holds an octal number:
function
isOctal
(
$str
)
{
return
strspn
(
$str
,
'01234567'
)
==
strlen
(
$str
);
}
The c
in strcspn()
stands for
complement—it tells you how much of the start of
the string is not composed of the characters in the character set. Use
it when the number of interesting characters is greater than the
number of uninteresting characters. For example, this function tests
whether a string has any NUL-bytes, tabs, or carriage returns:
function
hasBadChars
(
$str
)
{
return
strcspn
(
$str
,
"
\n\t\0
"
)
!=
strlen
(
$str
);
}
The parse_url()
function
returns an array of components of a URL:
$array = parse_url(url
);
For example:
$bits
=
parse_url
(
"http://me:secret@example.com/cgi-bin/board?user=fred"
);
print_r
(
$bits
);
Array
(
[
scheme
]
=>
http
[
host
]
=>
example
.
com
[
user
]
=>
me
[
pass
]
=>
secret
[
path
]
=>
/
cgi
-
bin
/
board
[
query
]
=>
user
=
fred
)
The possible keys of the hash are scheme
, host
, port
, user
, pass
, path
, query
, and fragment
.
Get Programming PHP, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.