PHP 字符串操作:strlen()、strpos()、substr()
在 PHP 开发中,字符串是最常用的数据类型之一。处理用户输入、解析文本、生成动态内容等场景都离不开对字符串的操作。掌握 strlen()、strpos() 和 substr() 这三个基础函数,能帮你高效完成绝大多数字符串任务。
1. 获取字符串长度:strlen()
调用 strlen() 函数可以快速获取一个字符串包含多少个字符(按字节计数)。
执行以下代码即可获得字符串长度:
<?php
$text = "Hello, world!";
$length = strlen($text);
echo $length; // 输出 13
?>
注意:strlen() 计算的是字节数,不是字符数。对于纯英文或 ASCII 字符,一个字符占一个字节,结果准确。但如果字符串包含中文、表情符号或其他多字节字符(如 UTF-8 编码下的汉字通常占 3 字节),strlen() 返回的是总字节数,而非实际“字”的数量。
例如:
<?php
$chinese = "你好";
echo strlen($chinese); // 输出 6(因为每个汉字在 UTF-8 中占 3 字节)
?>
若需精确计算字符个数(而非字节数),应使用 mb_strlen() 并指定编码:
<?php
$chinese = "你好";
echo mb_strlen($chinese, 'UTF-8'); // 输出 2
?>
但在大多数基础场景(如验证密码长度、截取固定字节数内容),strlen() 已足够。
2. 查找子字符串位置:strpos()
使用 strpos() 可以判断某个子字符串是否存在于主字符串中,并返回它第一次出现的位置(从 0 开始计数)。
编写如下代码查找关键词位置:
<?php
$haystack = "The quick brown fox jumps over the lazy dog.";
$needle = "fox";
$position = strpos($haystack, $needle);
if ($position !== false) {
echo "找到 'fox',位置在: " . $position; // 输出 16
} else {
echo "未找到";
}
?>
```
关键细节:
- **必须用 `!== false` 判断**,因为如果子串出现在开头(位置 0),`if ($position)` 会误判为 `false`。
- `strpos()` **区分大小写**。若需忽略大小写,请使用 `stripos()`。
- 如果找不到子串,函数返回 `false`,不是 `-1`。
常见用途包括:
- 验证邮箱是否包含 `@`
- 检查 URL 是否以 `https://` 开头
- 判断文件扩展名是否存在
例如验证邮箱:
```php
<?php
$email = "user@example.com";
if (strpos($email, '@') !== false) {
echo "可能是有效邮箱";
}
?>
3. 截取字符串片段:substr()
调用 substr() 能从字符串中提取指定位置和长度的子串。
基本语法:
substr(原字符串, 起始位置, [长度])
执行以下示例理解其用法:
<?php
$text = "Programming is fun!";
// 从第 0 位开始,取 11 个字符
echo substr($text, 0, 11); // 输出 "Programming"
// 从第 12 位开始,取到末尾
echo substr($text, 12); // 输出 "is fun!"
// 从倒数第 4 位开始(负数表示从末尾往前数)
echo substr($text, -4); // 输出 "fun!"
?>
规则说明:
- 起始位置为 0 表示第一个字符。
- 若省略长度参数,则从起始位置一直取到字符串末尾。
- 起始位置可为负数,表示从字符串末尾向前偏移(
-1是最后一个字符)。 - 如果起始位置超出字符串范围,返回空字符串
""。 - 如果指定的长度超出剩余字符数,只返回到末尾为止的内容。
实用技巧:结合 strpos() 动态截取内容。
例如,从 URL 中提取域名后的路径部分:
<?php
$url = "https://example.com/user/profile?id=123";
$protocol_end = strpos($url, "://") + 3; // 找到 "://" 后的位置
$domain_end = strpos($url, "/", $protocol_end); // 从协议后开始找第一个 "/"
if ($domain_end !== false) {
$path = substr($url, $domain_end); // 截取路径
echo $path; // 输出 "/user/profile?id=123"
}
?>
```
---
## 综合应用:安全截断带关键词的文本
假设你要显示一段文章摘要,但要求:
1. 最多显示 50 个字符;
2. 如果原文超过 50 字,且在截断处附近有完整句子(以句号、问号等结尾),则优先在标点后截断;
3. 如果包含关键词“优惠”,则确保该词不被截断。
**实现步骤如下:**
1. **检查**原文长度是否超过 50:
```php
$content = "本季度推出全新优惠活动,凡购买满100元即可享受8折优惠!详情请咨询客服。";
$max_len = 50;
if (strlen($content) <= $max_len) {
echo $content;
return;
}
- 尝试在 50 字附近寻找合适的截断点(向后找最近的标点):
$truncated = substr($content, 0, $max_len); $last_period = strrpos($truncated, '。'); $last_exclam = strrpos($truncated, '!'); $last_question = strrpos($truncated, '?'); // 找出最靠后的标点位置 $break_pos = max($last_period, $last_exclam, $last_question); if ($break_pos !== false && $break_pos > $max_len - 10) { $summary = substr($content, 0, $break_pos + 3); // +3 因为中文标点占 3 字节 } else { $summary = $truncated . "..."; } ``` 3. **验证**关键词是否被完整保留: ```php if (strpos($content, '优惠') !== false && strpos($summary, '优惠') === false) { // 如果原文有“优惠”但摘要里没有,尝试扩展截取范围 $offer_pos = strpos($content, '优惠'); if ($offer_pos < $max_len + 20) { $summary = substr($content, 0, $offer_pos + 6) . "..."; // +6 覆盖“优惠”两个字 } } echo $summary;
通过组合 strlen()、strpos() 和 substr(),你可以灵活应对各种文本处理需求,既保证效率,又兼顾用户体验。

暂无评论,快来抢沙发吧!