PHP 字符串处理
本章将介绍 PHP 字符串的操作方法和正则表达式。
字符串基础
创建字符串
<?php
// 单引号字符串
$str1 = 'Hello World';
// 双引号字符串(解析变量和转义字符)
$name = "张三";
$str2 = "Hello, $name"; // Hello, 张三
// Heredoc 语法
$str3 = <<<EOD
这是一个
多行字符串
你好,$name
EOD;
// Nowdoc 语法(不解析变量)
$str4 = <<<'EOD'
这是一个
多行字符串
不解析变量 $name
EOD;
?>
单引号与双引号的区别
<?php
$name = "张三";
// 单引号:不解析变量,只转义 \' 和 \\
echo 'Hello, $name'; // 输出:Hello, $name
echo 'Hello, \'张三\''; // 输出:Hello, '张三'
echo 'Hello\nWorld'; // 输出:Hello\nWorld
// 双引号:解析变量和转义字符
echo "Hello, $name"; // 输出:Hello, 张三
echo "Hello\nWorld"; // 输出:Hello(换行)World
// 复杂变量语法
$user = ["name" => "张三"];
echo "Hello, {$user['name']}"; // 输出:Hello, 张三
echo "Hello, ${user['name']}"; // 输出:Hello, 张三(旧语法)
?>
字符串操作
获取字符串长度
<?php
$str = "Hello World";
// 字节长度
echo strlen($str); // 11
// 字符数(多字节安全)
$chinese = "你好世界";
echo strlen($chinese); // 12(UTF-8 编码,每个汉字 3 字节)
echo mb_strlen($chinese); // 4(字符数)
echo mb_strlen($chinese, "UTF-8"); // 4
?>
访问字符
<?php
$str = "Hello";
// 通过索引访问
echo $str[0]; // H
echo $str[4]; // o
echo $str[-1]; // o(最后一个字符,PHP 7.1+)
// 修改字符
$str[0] = "h";
echo $str; // hello
// 花括号语法(已弃用)
// echo $str{0};
?>
字符串查找
<?php
$str = "Hello World";
// 查找子串位置
echo strpos($str, "World"); // 6
echo strpos($str, "o"); // 4(第一次出现)
echo strrpos($str, "o"); // 7(最后一次出现)
// 大小写不敏感
echo stripos($str, "world"); // 6
echo strripos($str, "O"); // 7
// 查找任意字符
echo strcspn($str, "aeiou"); // 1(第一个元音前的字符数)
// 检查是否包含子串
if (strpos($str, "World") !== false) {
echo "找到 World";
}
// PHP 8+ 更简洁的方式
if (str_contains($str, "World")) {
echo "找到 World";
}
// 检查开头和结尾(PHP 8+)
if (str_starts_with($str, "Hello")) {
echo "以 Hello 开头";
}
if (str_ends_with($str, "World")) {
echo "以 World 结尾";
}
?>
字符串截取
<?php
$str = "Hello World";
// substr(字符串, 起始位置, 长度)
echo substr($str, 0, 5); // Hello
echo substr($str, 6); // World
echo substr($str, -5); // World
echo substr($str, -5, 3); // Wor
// 多字节字符串截取
$chinese = "你好世界";
echo mb_substr($chinese, 0, 2); // 你好
echo mb_substr($chinese, -2); // 世界
?>
字符串替换
<?php
$str = "Hello World";
// 替换所有匹配
echo str_replace("World", "PHP", $str); // Hello PHP
// 替换多个值
echo str_replace(["Hello", "World"], ["Hi", "PHP"], $str); // Hi PHP
// 大小写不敏感
echo str_ireplace("world", "PHP", $str); // Hello PHP
// 替换指定位置
echo substr_replace($str, "PHP", 6, 5); // Hello PHP
// 替换次数
$count = 0;
str_replace("l", "L", $str, $count);
echo $count; // 3
// 批量替换
echo strtr("Hello World", ["Hello" => "Hi", "World" => "PHP"]);
// Hi PHP
?>
字符串分割与连接
<?php
$str = "apple,banana,orange";
// 分割字符串
$arr = explode(",", $str);
// ["apple", "banana", "orange"]
// 限制分割数量
$arr = explode(",", $str, 2);
// ["apple", "banana,orange"]
// 连接数组
$arr = ["apple", "banana", "orange"];
echo implode(",", $arr); // apple,banana,orange
echo join(",", $arr); // 同 implode
// 分割为字符数组
$chars = str_split("Hello");
// ["H", "e", "l", "l", "o"]
// 按长度分割
$chunks = str_split("Hello", 2);
// ["He", "ll", "o"]
// 按分隔符分割(支持正则)
$arr = preg_split("/[,;]/", "apple,banana;orange");
// ["apple", "banana", "orange"]
?>
大小写转换
<?php
$str = "Hello World";
// 转小写
echo strtolower($str); // hello world
// 转大写
echo strtoupper($str); // HELLO WORLD
// 首字母大写
echo ucfirst("hello"); // Hello
// 首字母小写
echo lcfirst("Hello"); // hello
// 每个单词首字母大写
echo ucwords("hello world"); // Hello World
// 多字节安全
$chinese = "你好";
echo mb_strtolower("HELLO", "UTF-8");
echo mb_strtoupper("hello", "UTF-8");
?>
去除空白
<?php
$str = " Hello World ";
// 去除两端空白
echo trim($str); // "Hello World"
// 去除左侧空白
echo ltrim($str); // "Hello World "
// 去除右侧空白
echo rtrim($str); // " Hello World"
// 去除指定字符
echo trim("/hello/", "/"); // hello
// 去除多种字符
echo trim("123Hello123", "123"); // Hello
?>
字符串填充
<?php
$str = "Hello";
// 左侧填充
echo str_pad($str, 10, "-"); // -----Hello
echo str_pad($str, 10, "-", STR_PAD_LEFT); // Hello-----
echo str_pad($str, 10, "-", STR_PAD_BOTH); // --Hello---
// 重复字符串
echo str_repeat("ab", 3); // ababab
?>
字符串反转
<?php
$str = "Hello";
// 反转字符串
echo strrev($str); // olleH
// 多字节字符串反转
function mb_strrev($str) {
$result = "";
for ($i = mb_strlen($str) - 1; $i >= 0; $i--) {
$result .= mb_substr($str, $i, 1);
}
return $result;
}
echo mb_strrev("你好世界"); // 界世好你
?>
字符串比较
<?php
// 区分大小写比较
echo strcmp("Hello", "Hello"); // 0(相等)
echo strcmp("Hello", "hello"); // -32(Hello < hello)
echo strcmp("hello", "Hello"); // 32(hello > Hello)
// 不区分大小写比较
echo strcasecmp("Hello", "hello"); // 0
// 比较前 n 个字符
echo strncmp("Hello World", "Hello PHP", 5); // 0
// 自然排序比较
echo strnatcmp("img1.png", "img10.png"); // -1(img1 < img10)
echo strnatcasecmp("IMG1.png", "img10.png"); // -1(不区分大小写)
?>
字符串格式化
<?php
// printf 格式化输出
printf("姓名:%s,年龄:%d", "张三", 25);
// 输出:姓名:张三,年龄:25
// sprintf 返回格式化字符串
$str = sprintf("姓名:%s,年龄:%d", "张三", 25);
echo $str;
// 格式化数字
echo number_format(1234567.89, 2, ".", ","); // 1,234,567.89
// 格式说明符
// %s - 字符串
// %d - 整数
// %f - 浮点数
// %b - 二进制
// %o - 八进制
// %x - 十六进制(小写)
// %X - 十六进制(大写)
// %c - ASCII 字符
printf("%b", 10); // 1010
printf("%x", 255); // ff
printf("%04d", 5); // 0005(前导零)
printf("%.2f", 3.14159); // 3.14
?>
正则表达式
基本语法
<?php
// 定界符
$pattern = "/hello/i"; // / 是定界符,i 是修饰符
// 常用修饰符
// i - 不区分大小写
// m - 多行模式
// s - 单行模式(. 匹配换行符)
// u - UTF-8 模式
// x - 忽略空白和注释
?>
preg_match
<?php
$str = "Hello World";
// 检查是否匹配
if (preg_match("/World/", $str)) {
echo "找到匹配";
}
// 获取匹配结果
if (preg_match("/(\w+) (\w+)/", $str, $matches)) {
print_r($matches);
// [0 => "Hello World", 1 => "Hello", 2 => "World"]
}
// 获取所有匹配
$str = "abc 123 def 456";
preg_match_all("/\d+/", $str, $matches);
print_r($matches);
// [[0 => "123", 1 => "456"]]
// 命名捕获组
preg_match("/(?P<word>\w+)/", "Hello", $matches);
echo $matches['word']; // Hello
?>
preg_replace
<?php
$str = "Hello World";
// 替换匹配
echo preg_replace("/World/", "PHP", $str); // Hello PHP
// 使用回调函数
echo preg_replace_callback("/\w+/", function($matches) {
return strtoupper($matches[0]);
}, $str); // HELLO WORLD
// 使用数组批量替换
$patterns = ["/Hello/", "/World/"];
$replacements = ["Hi", "PHP"];
echo preg_replace($patterns, $replacements, $str); // Hi PHP
// 限制替换次数
echo preg_replace("/l/", "L", $str, 1); // HeLlo World
?>
preg_split
<?php
$str = "apple, banana; orange";
// 按正则分割
$arr = preg_split("/[,;]\s*/", $str);
// ["apple", "banana", "orange"]
// 限制分割数量
$arr = preg_split("/[,;]\s*/", $str, 2);
// ["apple", "banana; orange"]
?>
preg_grep
<?php
$arr = ["apple", "banana", "123", "orange"];
// 过滤匹配的元素
$result = preg_grep("/^[a-z]+$/", $arr);
// ["apple", "banana", "orange"]
// 过滤不匹配的元素
$result = preg_grep("/^[a-z]+$/", $arr, PREG_GREP_INVERT);
// ["123"]
?>
常用正则模式
<?php
// 邮箱验证
$email = "[email protected]";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
var_dump(preg_match($pattern, $email)); // 1
// 手机号验证(中国大陆)
$phone = "13812345678";
$pattern = "/^1[3-9]\d{9}$/";
var_dump(preg_match($pattern, $phone)); // 1
// URL 验证
$url = "https://www.example.com/path?query=1";
$pattern = "/^https?:\/\/[^\s]+$/";
var_dump(preg_match($pattern, $url)); // 1
// 身份证号验证
$id = "110101199001011234";
$pattern = "/^\d{17}[\dXx]$/";
var_dump(preg_match($pattern, $id)); // 1
// 提取 HTML 标签内容
$html = "<div>内容</div>";
preg_match("/<div>(.*?)<\/div>/", $html, $matches);
echo $matches[1]; // 内容
// 移除 HTML 标签
$html = "<p>Hello <b>World</b></p>";
echo strip_tags($html); // Hello World
// 只允许特定标签
echo strip_tags($html, "<b>"); // Hello <b>World</b>
?>
其他字符串函数
HTML 处理
<?php
// HTML 实体编码
$str = '<script>alert("XSS")</script>';
echo htmlspecialchars($str);
// <script>alert("XSS")</script>
// 解码 HTML 实体
echo htmlspecialchars_decode("<div>");
// <div>
// 转换所有 HTML 实体
echo htmlentities("<中文>");
// <中文>
// 换行符转 <br>
echo nl2br("Hello\nWorld");
// Hello<br />\nWorld
?>
URL 处理
<?php
// URL 编码
echo urlencode("你好 世界"); // %E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C
echo rawurlencode("你好 世界"); // %E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C
// URL 解码
echo urldecode("%E4%BD%A0%E5%A5%BD"); // 你好
echo rawurldecode("%E4%BD%A0%E5%A5%BD"); // 你好
// 解析 URL
$url = "https://user:[email protected]:8080/path?query=1#fragment";
$parts = parse_url($url);
// [
// "scheme" => "https",
// "host" => "example.com",
// "port" => 8080,
// "user" => "user",
// "pass" => "pass",
// "path" => "/path",
// "query" => "query=1",
// "fragment" => "fragment"
// ]
// 解析查询字符串
parse_str("name=张三&age=25", $params);
// ["name" => "张三", "age" => "25"]
// 生成查询字符串
echo http_build_query(["name" => "张三", "age" => 25]);
// name=%E5%BC%A0%E4%B8%89&age=25
?>
JSON 处理
<?php
$data = ["name" => "张三", "age" => 25];
// 编码为 JSON
echo json_encode($data);
// {"name":"\u5f20\u4e09","age":25}
// 编码选项
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// {"name":"张三","age":25}
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// {
// "name": "张三",
// "age": 25
// }
// 解码 JSON
$json = '{"name":"张三","age":25}';
$obj = json_decode($json); // 对象
$arr = json_decode($json, true); // 关联数组
// 错误处理
$result = json_decode('{"invalid json}');
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解析错误:" . json_last_error_msg();
}
?>
小结
本章我们学习了:
- 字符串的创建和访问
- 字符串操作:查找、截取、替换、分割、连接
- 大小写转换和空白处理
- 正则表达式的基本使用
- HTML、URL、JSON 处理
下一章我们将学习面向对象编程。