一、字符串操作
字符串是 PHP 中重要的数据类型之一。在 Web 开发中,很多情况下都需要对字符串进行处理和分析,通常将涉及字符串的格式化、字符串的连接与分割、字符串的比较、查找等一系列操作。用户和系统的交互也基本上是用文字来进行的,因此系统对文本信息,即字符串的处理非常重要。
PHP 中提供了大量用来处理字符串的内置函数,使用这些函数,可以在 PHP 程序中很方便地完成对字符串的各种操作。
1、字符串的定义与显示
字符串是由一对单引号或一对双引号包含的零个或多个字符组成的集合。 字符串的界定符有以下3种:
- 单引号
' - 双引号
" - 界定符
<<<
字符串的显示可以使用echo()函数和print()函数。
2、字符串的格式化
PHP还提供了其他一些字符串格式化输出的函数。
printf()
语法:printf(string $format, mixed $args = ?, mixed $... = ?): intsprintf()
语法:sprintf(string $format, mixed ...$values): stringvsprintf()
语法:vprintf(string $format, array $args): int- format格式
%% - 返回一个百分号 %
%b - 二进制数
%c - ASCII 值对应的字符
%d - 包含正负号的十进制数(负数、0、正数)
%e - 使用小写的科学计数法(例如 1.2e+2)
%E - 使用大写的科学计数法(例如 1.2E+2)
%u - 不包含正负号的十进制数(大于等于 0)
%f - 浮点数(本地设置)
%F - 浮点数(非本地设置)
%g - 较短的 %e 和 %f
%G - 较短的 %E 和 %f
%o - 八进制数
%s - 字符串
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)- 附加的格式值。必需放置在 % 和字母之间(例如 %.2f):
+(在数字前面加上 + 或 - 来定义数字的正负性。
默认情况下,只有负数才做标记,正数不做标记)'(规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。
例如:%'x20s(使用 “x” 作为填充))-(左调整变量值)[0-9](规定变量值的最小宽度).[0-9](规定小数位数或最大字符串长度)
- 附加的格式值。必需放置在 % 和字母之间(例如 %.2f):
<?php
//printf
$str1 = "中国";
$str2 = "中华人民共和国";
$n = 12;
printf("%14s \r\n", $str1);
printf($str2);
echo "\r\n";
printf("%'*14s \r\n", $str1);
printf("%12.3f \r\n", $n);
//sprintf
$a = sprintf("%'*14s \r\n", $str1);
echo $a;
//vsprintf
$str1 = ["中国", "中华人民共和国"];
$a = vsprintf("%'*14s \r\n %s", $str1);
echo $a;
?>
printf()函数中的参数是按序对应的。在第一个%符号处,插入str1,在第二个%符号处,插入str1,依次类推。
如果 %符号多于str参数,必须使用占位符。占位符被插入到 % 符号之后,由数字和 \$ 组成。
<?php
$num = 12;
printf("小数格式%1\$.2f<br>整数格式 %1\$u", $num);
$A = 92;
$B = 23.2;
printf("变量A小数格式:%1\$.2f<br>变量B整数格式:%2\$u<br> 变量A整数格式:%1\$u", $A, $B);
?>
3、常用字符串函数
①、获取字符串长度
strlen()获取字符串长度
语法:strlen(string $string): int- 在 strlen() 函数中,数字、英文、小数点、下划线和空格占一个字符长度;而一个 GB2312 编码的汉字占两个字符长度,一个 UTF-8 编码的汉字占三个字符长度。
mb_strlen()获取字符串的长度
语法:mb_strlen(string $str, string $encoding = mb_internal_encoding()): mixed- encoding
GB2312或GBK
UTF-8
默认采用PHP内部字符编码UTF-8 - 与 strlen() 函数不同,在 mb_strlen() 函数中,无论是汉字,还是英文、数字、小数点、下划线和空格,都只占一个字符长度。
- encoding
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<?php
$A = "hello";
$B = "我是中国人";
echo "变量A的长度:".strlen($A)."<br>";
echo "变量B的长度:".strlen($B)."<br>";
echo "变量B的长度:".mb_strlen($B)."<br>";
?>
提示:mb_strlen 并不是 PHP 的核心函数,使用前需要确保在 php.ini 中加载了 php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。
②、大小写转换
PHP 给我们提供了非常多的预定义函数,其中就包含关于字符串大小写转换的函数,如下表所示:
| 函数名称 | 功能 |
|---|---|
| strtoupper | 将字符串转化为大写 |
| strtolower | 将字符串转化为小写 |
| ucfirst | 将字符串的首字母转化为大写 |
| lcfirst | 将字符串的首字母转化为小写 |
| ucwords | 将字符串中每个单词的首字符转化为大写 |
<?php
$str = "We want To FLY"; //定义字符串类型的变量
echo strtolower ($str) . "<br>"; //输出转换为小写的字符串
echo strtoupper($str) . "<br>"; //输出转换为大写的字符串
echo ucfirst($str) . "<br>"; //输出转换为首字母大写的字符串
echo lcfirst($str) . "<br>"; //输出转换为首字母小写的字符串
echo ucwords($str) . "<br>"; //输出转换为单词首字母大写的字符串
echo $str; //输出原字符串
?>
③、去除字符串首尾空格和特殊字符
在网站中,用户在输入数据时,经常会在无意中输入多余的空格或者其它特殊字符。有些情况下,字符串中不允许出现空格和特殊字符,此时就需要去除字符串中的空格和特殊字符。
在 PHP 中提供了三个函数来去除字符串左右两边的空白字符和特殊字符,如下所示:
| 函数名称 | 功能 |
|---|---|
| trim | 去除字符串左右两边的空白字符和特殊字符 |
| ltrim | 除字符串左边的空白字符和特殊字符 |
| rtrim | 去除字符串右边的空白字符和特殊字符 |
语法格式如下:
trim(string $str, string $character_mask = " \t\n\r\0\x0B"): stringltrim(string $str, string $character_mask = ?): stringrtrim(string $str, string $character_mask = ?): string- $character_mask 可选参数,用于指定所有要去除的字符,也可以使用“..”列出一个字符范围。
- $character_mask 默认值
" " (ASCII 32 (0x20)),普通空格符。
“\t” (ASCII 9 (0x09)),制表符。
“\n” (ASCII 10 (0x0A)),换行符。
“\r” (ASCII 13 (0x0D)),回车符。
“\0” (ASCII 0 (0x00)),空字节符。
“\x0B” (ASCII 11 (0x0B)),垂直制表符。
<?php
$str = "123PHP 教程456";
var_dump(trim($str,'1..6'));
var_dump(ltrim($str,'1..6'));
var_dump(rtrim($str,'1..6'));
?>
④、查找子字符串
strstr()函数 查找字符串
语法:strstr(string $haystack, mixed $needle, bool $before_needle = false): string返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。- 该函数区分大小写。如果想要不区分大小写,请使用 stristr()
- 如果你仅仅想确定 needle 是否存在于 haystack 中,请使用速度更快、耗费内存更少的 strpos() 函数。
- $before_needle 若为 true,将返回 needle 在 haystack 中的位置之前的部分。
strpos()函数 查找字符串首次出现的位置
语法:strpos(string $haystack, mixed $needle, int $offset = 0): int返回 needle 在 haystack 中首次出现的数字位置。- 区分大小写
- 返回 needle 存在于 haystack 字符串起始的位置(独立于 offset)。同时注意字符串位置是从0开始,而不是从1开始的。
- 如果没找到 needle,将返回 false。
- 应使用 === 运算符来测试此函数的返回值。
<?php
//strstr
$s = "先天下之忧而忧,后天下之乐而乐";
$pos1 = strstr($s, "后");
var_dump($pos1);
$pos1 = strstr($s, ",", true);
var_dump($pos1);
//strpos
$pos1 = strpos("ABCabc", "C");
var_dump($pos1);
$pos1 = strpos("ABCabc", "1");
var_dump($pos1);
$pos1 = strpos("ABCabc", "A");
var_dump($pos1);
?>
⑤、字符串与ASCII码
在字符串处理中,使用ord()函数可以返回字符的ASCII码,也可以使用chr()函数返回ASCII码对应的字符。
ASCII码的作用是使英文字母、阿拉伯数字等符号可以被转换成计算机能识别的二进制数
<?php
echo ord("a"); //输出97,如果包含多个字符,只返回第一个字符的ASCII码
echo chr(98); //输出"b"
?>
4、字符串的比较
字符串的比较可以使用比较运算符==、!=、===、!==,也可以使用strcmp()和strncmp()。
strcmp(str1, str2)用于完全对比两个字符串的大小关系- 如果str1大于str2,函数返回1,如果两个字符串相等,函数返回0,如果str1小于str2,函数返回-1。
- 比较遵循以下规则
- 按字符串中各个字符的ASCII码值的大小比较;
- 对两个字符串中的字符,逐个比较,例如
"abc" > "aac"; - 区分英文字母的大小写,例如
"A" < "a"; - 采用GB2312编码的中文字符,按每个字符的拼音进行比较
strncmp(str1, str2, cmp_length)用于截取部分字符串进行大小比较
<?php
echo strcmp("我们", "你们"); // =1 "我们" > "你们" "women" > "nimen"
$A = "hello,My name is Tom";
$B = "hello,my name is Tom";
echo strncmp($A, $B, 6);
echo strncmp($A, $B, 8);
?>
5、字符串的替换
用字符串剪裁函数,只能去掉字符串左右两边的指定字符,若需要去掉字符串中间的指定字符,剪裁函数就无能为力了,这时可以使用字符串替换函数。 PHP中的字符串替换函数有2个:
str_replace- 语法格式:
str_replace(mixed $search, mixed $replace, mixed $subject, int &$count = ?): mixed- 如果搜索的字符串是一个数组,那么它将返回一个数组。
- 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
- 如果同时需要对某个数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余的元素将用空字符串进行替换。
- 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
- 语法格式:
substr_replace- 语法格式:
substr_replace(mixed $string, mixed $replacement, mixed $start, mixed $length = ?): mixed- start 规定在字符串的何处开始替换。
- 正数 - 在字符串的指定位置开始
- 负数 - 在从字符串结尾的指定位置开始0
- 在字符串中的第一个字符处开始
- length 规定要替换多少个字符。默认是与字符串长度相同。
- 正数 - 被替换的字符串长度
- 负数 - 从字符串末端开始的被替换字符数
- 0 - 插入而非替换
- start 规定在字符串的何处开始替换。
- 语法格式:
<?php
// str_replace
$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "Replacements: $i";
$find = array("Hello","world");
// $replace = array("B");
$replace = array("B", "c");
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr, $b));
echo $b;
//substr_replace
//从字符串的第 6 个位置开始替换(把 "world" 替换成 "earth"):
echo substr_replace("Hello world","earth",6);
//从字符串结尾的第 5 个位置开始替换(把 "world" 替换成 "earth"):
echo substr_replace("Hello world","earth",-5);
//在 "world" 开头插入 "Hello":
echo substr_replace("world","Hello ",0,0);
?>
6、字符串与HTML
①、将字符串转换为HTML实体形式
htmlspecialchars 将特殊字符转换为 HTML 实体
- 预定义的字符是:
&(和号)成为&"(双引号)成为"'(单引号)成为'<(小于)成为<>(大于)成为>
<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>
②、将HTML实体形式转换为特殊字符
htmlspecialchars_decode 与htmlspecialchars的作用相反
<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars_decode($str);
?>
③、换行符的转换
nl2br在字符串所有新行之前插入 HTML 换行标记
<?php
echo nl2br("foo isn't\n bar");
?>
7、其他字符串函数
①、字符串转数组
explode 使用一个字符串分割另一个字符串,返回由字符串组成的数组
语法:explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
- limit 可选。规定所返回的数组元素的数目。
- 大于 0 - 返回包含最多 limit 个元素的数组
- 小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
- 0 - 返回包含一个元素的数组
<?php
$str = "Hello world. I love Shanghai!";
print_r (explode(" ", $str));
print_r (explode(" ", $str, 2));
print_r (explode(" ", $str, -2));
?>
②、数组转字符串
implode 函数返回由数组元素组合成的字符串。
<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ", $arr);
?>
③、字符串加密
crypt 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。
<?php
//php8 第二参数必填
//注册时 通过crypt生产加密密码 保存到数据库
//每次的值不同,密码mypassword生成 11s6ek9C15TTI
$hashed_password = crypt('mypassword', mt_rand().'-'.time());
//登陆时,取得已加密的字符串,与登陆密码比对
$user_input = "mypassword";
$get_hashed_password = "11s6ek9C15TTI";
if (hash_equals($get_hashed_password, crypt($user_input, $get_hashed_password))) {
echo "Password verified!";
}
//官方推荐使用password_hash()
$hashed_password = password_hash("mypassword", PASSWORD_DEFAULT); //$2y$10$IPPyAtARiLU0j/jn9cqwiewi9LYYpLioY35h4gWNurHBZX1y2F5jW
$user_input = "mypassword";
$get_hashed_password = '$2y$10$IPPyAtARiLU0j/jn9cqwiewi9LYYpLioY35h4gWNurHBZX1y2F5jW';
if (password_verify($user_input, $get_hashed_password)) {
echo "Password verifie!";
}
?>
④、截取字符串
substr返回字符串的子串 语法:substr(string $string, int $start, int $length = ?): string- start 规定在字符串的何处开始。
- 正数 - 在字符串的指定位置开始
- 负数 - 在从字符串结尾的指定位置开始
- 0 - 在字符串中的第一个字符处开始
- length 规定要返回的字符串长度。默认是直到字符串的结尾。
- 正数 - 从 start 参数所在的位置返回
- 负数 - 从字符串末端返回
- start 规定在字符串的何处开始。
mb_substr函数返回字符串的一部分。substr() 函数只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。
<?php
//substr
echo substr("Hello world",10)."<br>";
echo substr("Hello world",1)."<br>";
echo substr("Hello world",3)."<br>";
echo substr("Hello world",7)."<br>";
echo substr("Hello world",-1)."<br>";
echo substr("Hello world",-10)."<br>";
echo substr("Hello world",-8)."<br>";
echo substr("Hello world",-4)."<br>";
//mb_substr
echo mb_substr("PHP基础教程", 3, 2);
?>
⑤、随机打乱字符串
str_shuffle 随机打乱一个字符串
<?php
// 生成验证码
$a = "ABCDE12345";
echo substr(str_shuffle($a), 0, 4);
?>
二、正则表达式
1、正则表达式简介
正则表达式也称为模式表达式,自身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观的字符串处理方法。正则表达式通过构建具有特定规则的模式,与输入的字符串信息比较,在特定的函数中使用从而实现字符串的匹配、查找、替换及分割等操作。使用正则表达式的主要目的就是为了通过简单的办法来实现强大的功能。 在PHP中,正则表达式基本上有以下3个作用:
- 判断给定字符串是否匹配正则表达式。
- 用新文本替换匹配文本。
- 将一个字符串拆分为一组更小的信息块,从字符串中获取其特定部分。
2、正则表达式的语法规则
正则表达式是由普通字符(例如字符 a 到 z)和特殊字符(称为“元字符”)以及模式修正符组成。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式的模式可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
①、普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符,包括所有大小写字母、数字、标点符号和一些符号。
最简单的正则表达式是用于搜索字符串相比较的单个普通字符。例如,单字符正则表达式/A/会始终匹配字母 A。
也可以将多个单字符组合起来形成较长的表达式,例如,正则表达式/the/会匹配搜索字符串中的 the、there、other 和 over the lazy dog 等。无须使用任何串联运算符,只需连续输入字符即可。
②、元字符
除普通字符之外,正则表达式还可以包含“元字符”。元字符可分为单字符元字符和多字符元字符。例如,元字符\d,它与数字字符相匹配。
下表中列出了所有的单字符元字符。
| 元字符 | 描述 | 示例 |
|---|---|---|
\ |
转义字符,将特殊字符变为普通字符 | \.匹配一个点号;\\匹配符号\ |
^ |
匹配字符串的开始位置 | ^he表示以he开头的字符串 |
$ |
匹配字符串的结束位置 | ok$表示以ok结尾的字符串 |
* |
匹配前面的字符0次或多次 | zo*能匹配z以及zoo,*等价于{0,} |
+ |
匹配前面的字符1次或多次 | zo+能匹配zo以及zoo,但不能匹配z,+等价于{1,} |
? |
匹配前面的字符0次或1次 | do(es)?可以匹配do或does中的do,?等价于{0,1} |
{n} |
n 是非负整数,匹配前面的字符n次 | o{2} 不能匹配Bob中的o,但能匹配food中的两个o |
{n,} |
n 是非负整数,至少匹配 n 次 | o{2} 不能匹配Bob中的o,但能匹配foooood中的所有o,o{1,}等价于o+,o{0,}等价于o* |
{n,m} |
n 和 m 是非负整数,其中 n<= m,匹配至少 n 次,至多 m 次 | o{1,3}匹配fooooood中的前三个o,o{0,1}等价于o? |
. |
匹配除\r\n之外的任何单个字符 |
s.t可以匹配sat sit set,但不能匹配seat |
x|y |
匹配x或y | z|food能匹配z或food,[z|f]ood能匹配zood或food |
[xyz] |
字符集合,匹配所包含的任意一个字符 | [abc]可以匹配plain中的a |
[^xyz] |
反向字符集合,匹配未包含的任意字符 | [^abc] 可以匹配plain中的p、l、i、n |
[a-z] |
字符范围,匹配指定范围内的任意字符 | [a-z] 可以匹配a到z范围内的任何小写字母字符 |
[^a-z] |
反向字符范围,与不在指定范围内的任何字符匹配 | [^a-z] 可以匹配不在范围a到z内的任何字符 |
\b |
匹配一个单词边界,指单词和空格间的位置 | er\b可以匹配never中的er,但不能匹配verb中的er |
\B |
匹配非边界字匹配 | er\B 与verb中的er匹配,但不匹配never中的er |
{n,m}在逗号和两个数之间不能有空格
预定义字符集
| 预定义字符集 | 描述 |
|---|---|
\d |
匹配一个数字字符,等价于[0-9] |
\D |
匹配一个非数字字符,等效于[^0-9] |
\s |
匹配任何不可见字符,包括空格、换行符等,等价于[\f\n\r\t\v] |
\S |
匹配任何可见字符,等价于[^\f\n\r\t\v] |
\w |
匹配包括下划线的任何单词字符,等效于[A-Za-z0-9] |
\W |
与除 A-Z、a-z、0-9 和下划线以外的任意字符匹配,等效于[^A-Za-z0-9] |
注意:若要匹配包括 \r\n 在内的任意字符,可以使用 [\s\S]
③、贪婪匹配与惰性匹配
- 贪婪表示匹配尽可能多的字符,默认的情况下时贪婪匹配
- 惰性表示匹配尽可能少的字符
- 要实现惰性匹配,需要在上一个限定符的后面加上
?符号
<?php
//贪婪匹配
preg_match('/p.*h/', 'phphphph', $matches);
print_r($matches); // 输出结果:Array([0] => phphphph)
//惰性匹配
preg_match('/p.*?h/', 'phphphph', $matches);
print_r($matches); // 输出结果:Array([0] => ph)
?>
④、括号字符()
- 改变限定符的作用范围
- 改变作用范围前 正则表达式:
firm|sh可匹配的结果:firm、sh - 改变作用范围后 正则表达式:
fi(rm|sh)可匹配的结果:firm、fish
- 改变作用范围前 正则表达式:
- 分组
- 分组前 正则表达式:
bana{2}可匹配的结果:banaa - 分组后 正则表达式:
ba(na){2}可匹配的结果:banana
- 分组前 正则表达式:
⑤、模式修正符
| 修正符 | 说明 | 示例 | 可匹配结果 |
|---|---|---|---|
| i | 可同时匹配大小写字母 | /con/i |
Con、con、cOn等 |
| m | 多行匹配 | /P.*/m |
PHP\nPc |
| s | 改变元字符“.”的含义,使其可以代表所有字符(包括换行符),其他模式不能匹配换行符 | /Hi.*my/s |
Hi\nmy |
| x | 忽略空白字符 | /n e e d/x |
need |
除此之外,模式修正符还可以多个组合使用。例如,既要忽视大小写又要忽视换行,则可以直接使用is,多个模式修正符没有顺序要求。
<?php
preg_match_all('/con/i', "ConABBcconlkbcOn", $matches);
print_r($matches);
preg_match_all('/^P.*/m', "PHP\nPc", $matches);
print_r($matches);
preg_match_all('/Hi.*my/s', "Hi\nmy", $matches);
print_r($matches);
preg_match_all('/n e e d/x', "need", $matches);
print_r($matches);
?>
⑥、常用实例
- 邮箱验证:
/^[_a-zA-Z0-9-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+$/ - 手机号验证:
/^1\d{10}$/、/^1[35678]\d{9}$/
3、Perl兼容正则表达式函数
①、preg_grep( )函数
语法格式如下:
array preg_grep (string $pattern, array $input)
函数preg_grep()返回一个数组,其中包括$input数组中与给定的$pattern模式相匹配的元素。对于数组$input中的每个元素,preg_grep()只进行一次匹配。
<?php
$subjects = array("Mechanical Engineering", "Medicine", "Social Science","Agriculture", "Commercial Science", "Politics");
//匹配所有仅由一个单词组成的科目名,"i"表示不区分大小写
$alonewords = preg_grep("/^[a-z]*$/i", $subjects);
var_dump($alonewords);
?>
②、preg_match( )和preg_match_all( )函数
preg_match()函数用于匹配字符串。其语法格式如下:
int preg_match ( string $pattern, string $subject [, array $matches])
该函数在字符串subject中搜索与表达式pattern相匹配的内容,成功则返回整个模式匹配的次数(可能为零),出错则返回false。如果定义了数组matches,则将每次匹配的结果存储到该数组中。
preg_match()第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用preg_match_all()函数。
<?php
$str = "php功能强大,学习php是一件快乐的事。";
$preg = "/[php]+/";
$a = preg_match($preg, $str, $match1);
echo $a."<br>";
var_dump($match1);
$b = preg_match_all($preg, $str, $match2);
echo "<p>".$b."<br>";
var_dump($match2);
?>
③、3.preg_quote( )函数
该函数可以对特殊字符进行自动转义,其语法格式如下:
string preg_quote( string $str [, string $delimiter] )
该函数给字符串str中的所有特殊字符前面加上一个反斜线,对其进行自动转义。如果定义了参数delimiter,则该参数所包含的字符串也将被转义,函数返回转义后的字符串。
提示:正则表达式的特殊字符包括:.\\+*?[^]$(){}=!<>|:。
<?php
$k1 = "$40 for a g3/400";
$k2 = preg_quote ($k1, "/");
echo "原字符串:".$k1. "<br>";
echo "转义字符串:".$k2;
?>
④、preg_replace( )函数
preg_replace()函数用于正则表达式的搜索和替换,其语法格式如下:
mixed preg_replace( mixed $pattern, mixed $replacement, mixed $subject [, int $limit ])
该函数在字符串subject中匹配表达式pattern,并将匹配项替换成字符串replacement。如果定义了参数limit,则替换limit次。上述参数除limit外都可以是一个数组。如果pattern和replacement都是数组,将以其键名在数组中出现的顺序来进行处理,这不一定和索引的数字顺序相同。如果使用索引来标识哪个pattern将被哪个replacement替换,应该在调用preg_replace()之前用ksort()函数对数组进行排序
<?php
$k1 = "The quick brown fox jumped over the lazy dog."; //定义变量
$k2 = preg_replace('/\s/','-',$k1);
//定义变量,并将替换后的字符串赋给它
echo "原字符串:".$k1. "<br>"; //输出字符串变量$k1
echo "替换空格后的字符串:".$k2; //输出字符串变量$k2
?>
⑤、preg_split( )函数
preg_split()函数用于分割字符串,其语法格式如下:
array preg_split( string $pattern, string $subject [, int $limit [, int $flags]] )
该函数返回一个数组,包含字符串subject经正则表达式pattern作为边界所分割出的子串。如果定义了参数limit,则最多返回limit个子串,如果limit是-1,则意味着没有限制,可以用来继续指定可选参数flags。
<?php
$str = "php mysql,apache ajax"; //定义字符串变量
$keywords = preg_split("/[\s,]+/", $str);
//定义变量,并将分割后的字符串赋给它
print_r($keywords); //输出分割后的字符串组成的数组
?>
三、综合案例
1、新建一个留言簿,留言簿上有Email地址和用户的留言,请提取用户的Email地址和留言内容。将Email地址中的@符号前的内容作为用户的用户名,留言内容中的“我”修改为“本人”。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>留言簿</title>
</head>
<body>
<form action="" method="POST">
<p>您的Email地址:</p>
<input type="text" name="Email" size="31"><br>
<p>您的留言:</p>
<textarea name="note" cols="30" rows="10"></textarea><br>
<input type="submit" name="bt1" value="提交">
<input type="reset" name="bt2" value="清空">
</form>
</body>
</html>
<?php
if(isset($_POST['bt1'])){
$email = $_POST['Email'];
$note = $_POST['note'];
if(!$email || !$note){
echo "<script>alert('Email地址和留言内容必须填写')</script>";
return;
}
if(!preg_match('/^[_a-zA-Z0-9-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+$/', $email)){
echo "<script>alert('Email地址格式错误')</script>";
return;
}
//分割邮箱 转数组
$emails = explode("@", $email);
//将留言中的“我”替换为“本人”
$newNote = str_replace("我", "本人", $note);
echo <<<ABC
<font face="黑体" size=4>
用户{$emails[0]}您好!
您是{$emails[1]}的网友!<br>
您的留言是:<br>
{$newNote}
</font>
ABC;
}
?>
2、使用正则表达式验证用户输入的表单内容是否满足格式要求。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>新用户注册</title>
</head>
<body>
<form action="" method="post">
<fieldset>
<legend>新用户注册</legend>
<p>用户名:<input type="text" name="username"/><span>* 不超过10个字符(数字,字母和下划线)</span></p>
<p>密码:<input type="password" name="password"/><span>* 4-14个数字</span></p>
<p>手机号码:<input type="text" name="phone"/><span>* 11位数字,第一位为1</span></p>
<p>邮箱:<input type="text" name="email"/><span>* 有效的邮箱地址</span></p>
<input type="submit" name="submit" value="注册">
<input type="reset" name="submit2" value="取消">
</fieldset>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$phone = $_POST['phone'];
$email = $_POST['email'];
$checkName = preg_match('/^\w{1,10}$/', $username);
$checPassword = preg_match('/^\d{4,14}$/', $password);
$checkPhone = preg_match('/^1\d{10}$/', $phone);
$checkEmail = preg_match('/^[_a-zA-Z0-9-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+$/', $email);
if($checkName && $checPassword && $checkPhone && $checkEmail){
echo "<script>alert('注册成功!')</script>";
} else {
echo "<script>alert('注册失败!')</script>";
}
}
?>
3、小说文本读取并分页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎访问小说网</title>
</head>
<body>
<table width = 400 align="center" border = 1>
<tr><td align="center">PHP读取小说</td></tr>
<tr>
<td>
<?php
$page = isset($_GET['page']) ? $_GET['page']: 1;
$charSize = 400;
$counter = file_get_contents("1.txt");
$length = mb_strlen($counter);
$pageCount = ceil( $length / $charSize);
echo mb_substr($counter, ($page-1)*$charSize, $charSize);
?>
</td>
</tr>
</table>
<table align="center" width = 400>
<tr>
<td>页次:<?php echo $page.'/'.$pageCount.'页'; ?></td>
<td>分页:
<?php
if($page != 1){
echo "<a href='demo.php?page=1'>首页</a>";
echo "<a href='demo.php?page=".($page-1)."'>上一页</a>";
}
if($page < $pageCount){
echo "<a href='demo.php?page=".($page+1)."'>下一页</a>";
echo "<a href='demo.php?page={$pageCount}'>尾页</a>";
}
?>
</td>
</tr>
</table>
</body>
</html>