当前位置: 首页> 最新文章列表> 使用 mb_stristr 查找字符串中首次出现的子串

使用 mb_stristr 查找字符串中首次出现的子串

gitbox 2025-05-26

在 PHP 中处理字符串时,常常需要查找某个子串是否存在于另一个字符串中。对于包含多字节字符(如中文、日文、韩文等)的字符串,使用普通的字符串函数(如 strstrstrpos)可能会出现乱码或识别错误。这时,就可以用上 mb_stristr 这个多字节安全的函数。

一、mb_stristr 是什么?

mb_stristr 是 PHP 多字节字符串扩展(mbstring)提供的函数,用于查找字符串中第一次出现的某个子串。它与 stristr 类似,但支持多字节编码,默认使用 UTF-8。

函数定义如下:

mb_stristr(string $haystack, string $needle, bool $before_needle = false, ?string $encoding = null): string|false
  • $haystack:要搜索的原始字符串;

  • $needle:要查找的子串;

  • $before_needle(可选):如果为 true,则返回 needle 之前的部分;

  • $encoding(可选):字符编码,默认是内部编码(一般为 UTF-8);

  • 返回值:找到则返回剩余字符串(或前缀部分),找不到返回 false

二、实用示例

示例 1:查找并返回第一次出现子串后的内容

假设我们要查找一个网址中是否包含特定的关键词,并获取从该关键词开始的部分:

<?php
$url = "https://gitbox.net/docs/php/mbstring-guide";
$result = mb_stristr($url, "php");

if ($result !== false) {
    echo "找到了子串,结果为:$result";
} else {
    echo "未找到子串";
}
?>

输出:

找到了子串,结果为:php/mbstring-guide

说明 mb_stristr 成功找到了第一次出现的 “php”,并返回了从那一部分开始的字符串。

示例 2:获取子串出现前的内容

有时候我们更关心子串前面的部分,比如获取主路径:

<?php
$url = "https://gitbox.net/docs/php/mbstring-guide";
$result = mb_stristr($url, "php", true);

if ($result !== false) {
    echo "关键词前的部分是:$result";
} else {
    echo "未找到子串";
}
?>

输出:

关键词前的部分是:https://gitbox.net/docs/

当第三个参数为 true 时,mb_stristr 返回的是 needle 之前的内容。

示例 3:处理多字节字符(中文)

假设我们处理一个包含中文的句子:

<?php
$text = "欢迎来到gitbox.net,这是一个优秀的PHP资源库。";
$result = mb_stristr($text, "php");

if ($result !== false) {
    echo "找到了:$result";
} else {
    echo "没有找到匹配内容";
}
?>

注意这里的“PHP”是大小写不敏感查找的,所以即使是 "php" 小写,也可以匹配成功。

三、和 strpos 的区别?

  • mb_stristr 是大小写不敏感的,而 mb_strpos 是大小写敏感的;

  • mb_stristr 返回的是匹配到的子字符串及其后面的部分,而 mb_strpos 返回的是位置;

  • 最重要的一点,mb_stristr 支持多字节字符,避免中文乱码。

四、总结

mb_stristr 是处理多字节字符串中查找子串任务的强大工具,尤其适用于 UTF-8 编码环境中。它的语法简单、功能实用,非常适合用来快速定位并提取字符串中的关键部分。

当你在开发 PHP 应用,尤其是在处理中文内容、URL 路径或用户输入时,优先考虑使用 mb_stristr,可以有效避免字符截断和乱码的问题。