在 PHP 中处理字符串时,常常需要查找某个子串是否存在于另一个字符串中。对于包含多字节字符(如中文、日文、韩文等)的字符串,使用普通的字符串函数(如 strstr 或 strpos)可能会出现乱码或识别错误。这时,就可以用上 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。
假设我们要查找一个网址中是否包含特定的关键词,并获取从该关键词开始的部分:
<?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”,并返回了从那一部分开始的字符串。
有时候我们更关心子串前面的部分,比如获取主路径:
<?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 之前的内容。
假设我们处理一个包含中文的句子:
<?php
$text = "欢迎来到gitbox.net,这是一个优秀的PHP资源库。";
$result = mb_stristr($text, "php");
if ($result !== false) {
echo "找到了:$result";
} else {
echo "没有找到匹配内容";
}
?>
注意这里的“PHP”是大小写不敏感查找的,所以即使是 "php" 小写,也可以匹配成功。
mb_stristr 是大小写不敏感的,而 mb_strpos 是大小写敏感的;
mb_stristr 返回的是匹配到的子字符串及其后面的部分,而 mb_strpos 返回的是位置;
最重要的一点,mb_stristr 支持多字节字符,避免中文乱码。
mb_stristr 是处理多字节字符串中查找子串任务的强大工具,尤其适用于 UTF-8 编码环境中。它的语法简单、功能实用,非常适合用来快速定位并提取字符串中的关键部分。
当你在开发 PHP 应用,尤其是在处理中文内容、URL 路径或用户输入时,优先考虑使用 mb_stristr,可以有效避免字符截断和乱码的问题。