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),加 !== 严格比较。

📖 小节

📝 作业

  1. 把一段用户输入的文本做处理:去掉两端空格 → 把所有英文转为小写 → 把所有空格替换为下划线 → 输出结果。
  2. explode 将逗号分隔的标签字符串转为数组,去重后,用 implode 重新合并输出。
  3. 写一个函数,接收一个邮箱字符串,用 strpossubstr 提取出用户名部分(@之前的内容)。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏