跳到主要内容

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);
// &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;

// 解码 HTML 实体
echo htmlspecialchars_decode("&lt;div&gt;");
// <div>

// 转换所有 HTML 实体
echo htmlentities("<中文>");
// &lt;&#20013;&#25991;&gt;

// 换行符转 <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();
}
?>

小结

本章我们学习了:

  1. 字符串的创建和访问
  2. 字符串操作:查找、截取、替换、分割、连接
  3. 大小写转换和空白处理
  4. 正则表达式的基本使用
  5. HTML、URL、JSON 处理

下一章我们将学习面向对象编程。