“详细说说这部分”:如何在 PHP 中判断字符串以什么开头?
\n\n每个开发者一生中至少会遇到一次这样的任务:“这个字符串是不是以某个特定的单词、字符或前缀开头的?”。看似小事,但路由逻辑、URL 检查、电子邮件验证或用户输入解析都可能依赖于此。在 PHP 中,和其他任何语言一样,有几种方法可以解决这个问题。但哪种方法是正确的?哪种性能最高?如果您的 PHP 版本较旧,又该怎么办?
\n\n在本文中,我们将详细分析 PHP 中检查字符串开头的所有流行方法,从经典的 substr 和 strpos 到 PHP 8.0 中引入的现代 str_starts_with。您不仅会了解“如何做”,还会明白“为什么”应该选择某种方法。开始吧!🚀
为什么要检查字符串开头?
\n\n想象一下,您正在编写日志解析器、处理 URL 或按扩展名过滤文件。或者,您可能需要筛选出所有以“admin@”开头的电子邮件地址。或者检查 API 请求是否带有正确的前缀。在所有这些情况下,您只需要一件事:判断字符串是否在开头包含指定的子串。
\n\n看似简单的任务,但如果不了解其中的细微差别,可能会导致难以发现的错误。特别是如果您不小心使用了 strpos 而没有检查 false。让我们逐一分析每种方法。
方法 #1:str_starts_with (PHP 8.0+) — 现代且直观
\n\n从 PHP 8.0 开始,该语言引入了一个专门的函数 str_starts_with()。它完全如其名:检查字符串是否以指定的子串开头。而且它速度快、可读性强,并且没有陷阱。
<?php\n$url = "https://pythonlib.ru";\nif (str_starts_with($url, "https://")) {\n echo "字符串以 https:// 开头";\n} else {\n echo "字符串不以 https:// 开头";\n}\n// 输出:字符串以 https:// 开头\n?>\n\n为什么这很棒?
\n- \n
- ✅ 代码读起来就像普通的英文文本:“string starts with”。 \n
- ✅ 只返回
true或false— 无需额外检查。 \n - ✅ 正确处理多字节编码(UTF-8)。 \n
- ✅ 区分大小写。如果需要不区分大小写的检查,请使用
str_starts_with(strtolower(...))。 \n
如果您的 PHP 版本是 8.0 或更高,这种方法无疑是首选。但如果您的项目仍然运行在 PHP 7 上呢?请继续阅读。
\n\n方法 #2:substr — 老朋友胜过新朋友
\n\n在 str_starts_with 出现之前,许多人使用 substr 来比较字符串的开头。思路很简单:从字符串中截取所需长度的部分,然后将其与目标子串进行比较。
<?php\n$string = "Hello, world!";\n$prefix = "Hello";\n\nif (substr($string, 0, strlen($prefix)) === $prefix) {\n echo "字符串以 'Hello' 开头";\n} else {\n echo "字符串不以 'Hello' 开头";\n}\n?>\n\n优点:
\n- \n
- 适用于任何 PHP 版本。 \n
- 逻辑清晰。 \n
缺点:
\n- \n
- 需要记住使用
strlen()— 很容易在长度上出错。 \n - 如果字符串比前缀短,
substr将返回空字符串,比较会失败(但不会崩溃)。 \n - 可读性不如现代替代方案。 \n
尽管如此,这是一个完全可行的方案,不会让您失望。关键是不要忘记使用严格比较 ===。
方法 #3:strpos — 巧妙但危险
\n\n另一种经典方法是使用 strpos()。该函数查找子串的首次出现