PHP: 字符串
PHP 处理字符串的能力极强——毕竟它最初就是为生成 HTML 文本而生的。这节课让你掌握 PHP 字符串的所有核心操作。
1. 单引号 vs 双引号
PHP
<?php
$name = "小明";
// 单引号:原样输出,不解析变量
echo '你好,$name'; // 你好,$name(变量没被解析)
// 双引号:解析变量和转义符
echo "你好,$name"; // 你好,小明(变量被解析)
echo "你好,{$name}"; // 你好,小明(花括号明确变量边界,推荐)
?>
| 特性 | 单引号 '' |
双引号 "" |
|---|---|---|
| 解析变量 | ❌ | ✅ |
解析转义符(\n \t) |
❌(仅 \\ \') |
✅ |
| 速度 | 略快(不解析) | 略慢 |
| 适用场景 | 纯文本、配置值 | 需要嵌入变量时 |
▶ 示例:花括号明确变量边界
PHP
<?php
$drink = "咖啡";
echo "给我一杯{$drink}拿铁"; // 给我一杯咖啡拿铁 ✅
echo "给我一杯$drink拿铁"; // Warning: 变量$drink拿铁不存在
// 中文紧跟在变量后面时,必须用花括号
?>
💡 提示: 在双引号中嵌入变量时统一用
{$var} 花括号语法,最安全也最好读。
2. Heredoc 和 Nowdoc
当需要写多行字符串时,Heredoc 和 Nowdoc 比反复拼接单双引号优雅得多:
PHP
<?php
$title = "PHP教程";
// Heredoc:相当于双引号的多行版(解析变量)
$html = <<<HTML
<div class="header">
<h1>{$title}</h1>
<p>今天是第一课</p>
</div>
HTML;
// Nowdoc:相当于单引号的多行版(不解析变量)
$config = <<<'CONFIG'
database_host = localhost
database_name = $db_name
CONFIG;
// $db_name 不会被解析,原样输出
echo $html;
?>
💡 提示: Heredoc 很适合在 PHP 中输出大段 HTML 模板。结束标记(上面例子中的
HTML;)必须在行首,前面没有空格或缩进。
3. 字符串拼接
PHP 用点号 . 拼接字符串(不是 + 号,那是数学运算):
PHP
<?php
// 用 . 拼接
$greeting = "你好," . "世界!";
echo $greeting; // 你好,世界!
// 拼接变量
$name = "小明";
echo "欢迎," . $name . "同学"; // 欢迎,小明同学
// . 和 = 组合:追加拼接
$text = "PHP";
$text .= "教程"; // 等同于 $text = $text . "教程"
echo $text; // PHP教程
?>
🔥 易错: PHP 中
+ 是数学加法,. 才是字符串拼接。"10" + "5" = 15(数字相加),"10" . "5" = "105"(字符串拼接)。
4. 常用字符串函数
PHP 内置了超过 100 个字符串处理函数。以下是使用频率最高的:
▶ 示例:核心字符串操作
PHP
<?php
$str = "Hello PHP World";
// 长度
echo strlen($str); // 16
// 查找位置(找不到返回 false)
echo strpos($str, "PHP"); // 6(从0开始)
var_dump(strpos($str, "Java")); // bool(false)
// 子串
echo substr($str, 6, 3); // "PHP"(从位置6取3个字符)
echo substr($str, -5); // "World"(倒数第5个开始到末尾)
// 替换
echo str_replace("World", "地球", $str); // Hello PHP 地球
echo str_ireplace("php", "JS", $str); // Hello JS World(不区分大小写)
// 去除空白字符
$input = " 你好 ";
echo trim($input); // "你好"(去两端空格)
echo ltrim($input); // "你好 "(只去左边)
echo rtrim($input); // " 你好"(只去右边)
// 大小写转换
echo strtoupper("hello"); // HELLO
echo strtolower("HELLO"); // hello
echo ucfirst("hello world"); // Hello world(首字母大写)
echo ucwords("hello world"); // Hello World(每个单词首字母大写)
?>
5. 字符串分割与合并
PHP
<?php
// explode:字符串 → 数组(按分隔符拆分)
$tags = "PHP,MySQL,Redis";
$tagArray = explode(",", $tags);
var_dump($tagArray); // ["PHP", "MySQL", "Redis"]
// implode / join:数组 → 字符串(用分隔符合并)
$arr = ["苹果", "香蕉", "橘子"];
echo implode("、", $arr); // 苹果、香蕉、橘子
echo join(" - ", $arr); // 苹果 - 香蕉 - 橘子(join 是 implode 的别名)
// str_split:按长度拆分
$chars = str_split("Hello", 2);
var_dump($chars); // ["He", "ll", "o"]
?>
6. 字符串格式化
PHP
<?php
// sprintf:格式化字符串(像 C 语言一样)
$name = "小明";
$score = 92.5;
echo sprintf("%s的分数是%.1f分", $name, $score); // 小明的分数是92.5分
// 常用格式化占位符
// %s — 字符串
// %d — 整数
// %f — 浮点数
// %.2f — 保留2位小数
// number_format:千分位格式化
echo number_format(1234567.89, 2); // 1,234,567.89
// nl2br:换行符 → <br>(数据库文本展示到网页必备)
$text = "第一行\n第二行\n第三行";
echo nl2br($text);
// 输出:第一行<br>第二行<br>第三行
?>
▶ 示例:字符串综合应用
PHP
<?php
// 场景:处理用户输入的名字
$input = " 张三 ";
$name = trim($input); // 去空格
// 检查是否包含敏感词
if (strpos($name, "admin") !== false) {
echo "用户名不能包含admin";
} else {
echo "欢迎," . strtoupper($name) . "!"; // 欢迎,张三!
}
// 注意:strpos 返回位置,位置0也是合法值
// 所以必须用 !== false 判断,不能用 !strpos()
?>
🔥 易错:
strpos() 找到在位置 0 时返回 0,而 PHP 中 0 == false!所以必须用 !== false 严格比较来判断"是否找到",不要用 if (strpos(...))。
❓ 常见问题
Q 单引号和双引号什么时候用哪个?
A 不需要嵌入变量时用单引号(略快),需要嵌入变量或转义符时用双引号。模板类的大段 HTML 用 Heredoc。
Q
explode() 和 str_split() 有什么区别?A
explode("分隔符", $str) 按指定分隔符拆分,str_split($str, 长度) 按固定长度拆分。Q strpos 返回 0 怎么办,0 在 if 中是 false?
A 这是 PHP 最常见的陷阱之一。避免的方法是永远用
if (strpos($haystack, $needle) !== false),加 !== 严格比较。📖 小节
- 单引号不解析变量/转义符(纯文本用),双引号解析(嵌变量用)
.拼接字符串,.=追加拼接(不是+)- Heredoc 写多行模板(解析变量),Nowdoc 写多行纯文本(不解析)
strlen/strpos/substr/str_replace/trim是最常用函数explode拆分字符串为数组,implode合并数组为字符串strpos()必须用!== false判断,不能用if (strpos())
📝 作业
- 把一段用户输入的文本做处理:去掉两端空格 → 把所有英文转为小写 → 把所有空格替换为下划线 → 输出结果。
- 用
explode将逗号分隔的标签字符串转为数组,去重后,用implode重新合并输出。 - 写一个函数,接收一个邮箱字符串,用
strpos和substr提取出用户名部分(@之前的内容)。