文章目录

PHP 字符串操作:strlen()、strpos()、substr()

发布于 2026-04-02 10:48:24 · 浏览 12 次 · 评论 0 条

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;
   }
  1. 尝试在 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(),你可以灵活应对各种文本处理需求,既保证效率,又兼顾用户体验。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文