在 PHP 中检查字符串开头:从 substr 到 str_starts_with

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

“详细说说这部分”:如何在 PHP 中判断字符串以什么开头?

\n\n

每个开发者一生中至少会遇到一次这样的任务:“这个字符串是不是以某个特定的单词、字符或前缀开头的?”。看似小事,但路由逻辑、URL 检查、电子邮件验证或用户输入解析都可能依赖于此。在 PHP 中,和其他任何语言一样,有几种方法可以解决这个问题。但哪种方法是正确的?哪种性能最高?如果您的 PHP 版本较旧,又该怎么办?

\n\n

在本文中,我们将详细分析 PHP 中检查字符串开头的所有流行方法,从经典的 substr 和 strpos 到 PHP 8.0 中引入的现代 str_starts_with。您不仅会了解“如何做”,还会明白“为什么”应该选择某种方法。开始吧!🚀

\n\n

为什么要检查字符串开头?

\n\n

想象一下,您正在编写日志解析器、处理 URL 或按扩展名过滤文件。或者,您可能需要筛选出所有以“admin@”开头的电子邮件地址。或者检查 API 请求是否带有正确的前缀。在所有这些情况下,您只需要一件事:判断字符串是否在开头包含指定的子串。

\n\n

看似简单的任务,但如果不了解其中的细微差别,可能会导致难以发现的错误。特别是如果您不小心使用了 strpos 而没有检查 false。让我们逐一分析每种方法。

\n\n

方法 #1:str_starts_with (PHP 8.0+) — 现代且直观

\n\n

从 PHP 8.0 开始,该语言引入了一个专门的函数 str_starts_with()。它完全如其名:检查字符串是否以指定的子串开头。而且它速度快、可读性强,并且没有陷阱。

\n\n
<?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
\n\n

如果您的 PHP 版本是 8.0 或更高,这种方法无疑是首选。但如果您的项目仍然运行在 PHP 7 上呢?请继续阅读。

\n\n

方法 #2:substr — 老朋友胜过新朋友

\n\n

在 str_starts_with 出现之前,许多人使用 substr 来比较字符串的开头。思路很简单:从字符串中截取所需长度的部分,然后将其与目标子串进行比较。

\n\n
<?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
    \n
  • 需要记住使用 strlen() — 很容易在长度上出错。
  • \n
  • 如果字符串比前缀短,substr 将返回空字符串,比较会失败(但不会崩溃)。
  • \n
  • 可读性不如现代替代方案。
  • \n
\n\n

尽管如此,这是一个完全可行的方案,不会让您失望。关键是不要忘记使用严格比较 ===。

\n\n

方法 #3:strpos — 巧妙但危险

\n\n

另一种经典方法是使用 strpos()。该函数查找子串的首次出现

博客

书籍推荐