<返回目录     Powered by claud/xia兄

第7课: 字符串处理

字符串基础

字符串是PHP中最常用的数据类型之一,PHP提供了丰富的字符串处理函数。

字符串创建

<?php
// 单引号字符串(不解析变量)
$str1 = 'Hello World';
$name = 'PHP';
echo 'Hello $name';  // 输出: Hello $name

// 双引号字符串(解析变量)
$str2 = "Hello World";
echo "Hello $name";  // 输出: Hello PHP
echo "Hello {$name}";  // 使用花括号更清晰

// Heredoc语法(多行字符串,解析变量)
$html = <<<HTML
<div>
    <h1>标题</h1>
    <p>内容:$name</p>
</div>
HTML;

// Nowdoc语法(多行字符串,不解析变量)
$text = <<<'TEXT'
这是原始文本
$name 不会被解析
TEXT;
?>

字符串长度和访问

获取字符串长度

<?php
$str = "Hello World";
echo strlen($str);  // 11 - 字节长度

// 多字节字符串(中文等)
$chinese = "你好世界";
echo strlen($chinese);     // 12 - 字节长度(UTF-8每个中文3字节)
echo mb_strlen($chinese);  // 4 - 字符长度

// 设置多字节编码
mb_internal_encoding("UTF-8");
?>

访问字符串字符

<?php
$str = "Hello";
echo $str[0];     // H - 第一个字符
echo $str[4];     // o - 第五个字符
echo $str[-1];    // o - 最后一个字符(PHP 7.1+)

// 修改字符
$str[0] = 'h';
echo $str;  // hello
?>

字符串查找

查找子字符串位置

<?php
$text = "Hello World, Welcome to PHP World";

// strpos - 查找第一次出现的位置
$pos = strpos($text, "World");  // 6
$pos = strpos($text, "world");  // false(区分大小写)

// stripos - 不区分大小写查找
$pos = stripos($text, "world");  // 6

// strrpos - 查找最后一次出现的位置
$pos = strrpos($text, "World");  // 32

// 注意:位置0也是有效位置
if (strpos($text, "Hello") !== false) {
    echo "找到了";
}
?>

PHP 8+ 新函数

<?php
$text = "Hello World";

// 检查是否包含
str_contains($text, "World");  // true
str_contains($text, "PHP");    // false

// 检查开头
str_starts_with($text, "Hello");  // true
str_starts_with($text, "World");  // false

// 检查结尾
str_ends_with($text, "World");  // true
str_ends_with($text, "Hello");  // false
?>

字符串替换

简单替换

<?php
$str = "Hello World";

// str_replace - 替换所有匹配
$new = str_replace("World", "PHP", $str);
echo $new;  // Hello PHP

// 替换多个
$text = "I like apples and oranges";
$new = str_replace(["apples", "oranges"], ["bananas", "grapes"], $text);
// I like bananas and grapes

// 不区分大小写替换
$new = str_ireplace("world", "PHP", "Hello WORLD");  // Hello PHP

// 统计替换次数
$count = 0;
$new = str_replace("a", "A", "banana", $count);
echo $count;  // 3
?>

正则表达式替换

<?php
$text = "My phone is 123-456-7890";

// preg_replace - 正则替换
$new = preg_replace('/\d/', 'X', $text);
// My phone is XXX-XXX-XXXX

// 替换多个空格为一个
$text = "Hello    World";
$new = preg_replace('/\s+/', ' ', $text);  // Hello World
?>

字符串分割与合并

分割字符串

<?php
// explode - 按分隔符分割
$str = "apple,banana,orange";
$arr = explode(",", $str);
// ["apple", "banana", "orange"]

// 限制分割数量
$arr = explode(",", $str, 2);
// ["apple", "banana,orange"]

// str_split - 按长度分割
$str = "Hello";
$arr = str_split($str);     // ["H", "e", "l", "l", "o"]
$arr = str_split($str, 2);  // ["He", "ll", "o"]

// preg_split - 正则分割
$str = "apple, banana,  orange";
$arr = preg_split('/\s*,\s*/', $str);
// ["apple", "banana", "orange"]
?>

合并字符串

<?php
// implode/join - 数组合并为字符串
$arr = ["apple", "banana", "orange"];
$str = implode(", ", $arr);  // apple, banana, orange
$str = join("-", $arr);      // apple-banana-orange

// 连接运算符
$str = "Hello" . " " . "World";  // Hello World
?>

大小写转换

<?php
$str = "Hello World";

// 全部转换
strtoupper($str);  // HELLO WORLD
strtolower($str);  // hello world

// 首字母转换
ucfirst($str);     // Hello world(首字母大写)
lcfirst($str);     // hello World(首字母小写)
ucwords($str);     // Hello World(每个单词首字母大写)

// 多字节字符串转换
$chinese = "你好世界";
mb_strtoupper($chinese);  // 你好世界(中文无大小写)
?>

去除空格和字符

<?php
$str = "  Hello World  ";

// 去除两端空格
trim($str);   // "Hello World"
ltrim($str);  // "Hello World  "(左侧)
rtrim($str);  // "  Hello World"(右侧)

// 去除指定字符
$str = "###Hello###";
trim($str, "#");  // "Hello"

// 去除多种字符
$str = " \t\nHello\n\t ";
trim($str);  // "Hello"(去除空格、制表符、换行符)
?>

字符串截取

<?php
$str = "Hello World";

// substr - 截取子字符串
substr($str, 0, 5);   // "Hello"(从0开始,长度5)
substr($str, 6);      // "World"(从6到结尾)
substr($str, -5);     // "World"(从倒数第5个开始)
substr($str, 0, -6);  // "Hello"(从0到倒数第6个)

// mb_substr - 多字节安全截取
$chinese = "你好世界";
mb_substr($chinese, 0, 2);  // "你好"

// 截取并替换
$str = "Hello World";
substr_replace($str, "PHP", 6, 5);  // "Hello PHP"
?>

字符串比较

<?php
$str1 = "Hello";
$str2 = "hello";

// 使用运算符
$str1 == $str2;   // false(区分大小写)
$str1 === $str2;  // false

// strcmp - 字符串比较
strcmp($str1, $str2);   // < 0(str1 < str2)
strcasecmp($str1, $str2);  // 0(不区分大小写)

// 自然排序比较
strnatcmp("img2.png", "img10.png");  // < 0(正确排序)
?>

字符串格式化

sprintf - 格式化字符串

<?php
// 格式化输出
$name = "张三";
$age = 25;
$str = sprintf("姓名:%s,年龄:%d", $name, $age);
// 姓名:张三,年龄:25

// 数字格式化
sprintf("%05d", 42);      // "00042"(补零)
sprintf("%.2f", 3.1415);  // "3.14"(保留2位小数)
sprintf("%'#10s", "test"); // "######test"(填充字符)

// number_format - 数字格式化
number_format(1234567.89, 2);  // "1,234,567.89"
number_format(1234567.89, 2, ".", ",");  // "1.234.567,89"
?>

printf - 直接输出

<?php
printf("圆周率:%.2f\n", 3.1415926);  // 圆周率:3.14
printf("十六进制:%x\n", 255);        // 十六进制:ff
?>

字符串编码

<?php
// HTML实体编码
$str = "<script>alert('XSS')</script>";
$safe = htmlspecialchars($str);
// &lt;script&gt;alert('XSS')&lt;/script&gt;

// URL编码
$url = "https://example.com?name=张三&age=25";
$encoded = urlencode($url);
$decoded = urldecode($encoded);

// Base64编码
$data = "Hello World";
$encoded = base64_encode($data);  // SGVsbG8gV29ybGQ=
$decoded = base64_decode($encoded);  // Hello World
?>

正则表达式

匹配模式

<?php
$text = "My email is test@example.com";

// preg_match - 匹配一次
if (preg_match('/\w+@\w+\.\w+/', $text, $matches)) {
    echo $matches[0];  // test@example.com
}

// preg_match_all - 匹配所有
$text = "Phone: 123-456-7890, 098-765-4321";
preg_match_all('/\d{3}-\d{3}-\d{4}/', $text, $matches);
print_r($matches[0]);  // 所有匹配的电话号码
?>

验证格式

<?php
// 验证邮箱
function isValidEmail($email) {
    return preg_match('/^[\w\.-]+@[\w\.-]+\.\w+$/', $email);
}

// 验证手机号
function isValidPhone($phone) {
    return preg_match('/^1[3-9]\d{9}$/', $phone);
}

// 验证身份证
function isValidID($id) {
    return preg_match('/^\d{17}[\dXx]$/', $id);
}
?>
最佳实践:

实践练习

  1. 字符串处理:编写函数去除字符串中的所有空格
  2. 字符串查找:统计一个单词在文本中出现的次数
  3. 字符串替换:实现敏感词过滤功能
  4. 字符串分割:解析CSV格式的数据
  5. 格式验证:验证用户输入的邮箱、手机号是否合法
  6. 字符串截取:实现文章摘要功能(截取前100字)
  7. 大小写转换:将标题转换为URL友好格式
  8. 正则表达式:从HTML中提取所有链接地址