PHP 8: str_starts_with 和 str_ends_with — 如何检查字符串的开头和结尾

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

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

开始课程

告别笨拙代码:认识 PHP 8 中的 str_starts_with 和 str_ends_with

\n\n

你是否曾经写过像 if (strpos($str, 'prefix') === 0) 这样的代码,并觉得它看起来有些笨拙?或者,你是否曾花时间解读 substr($str, -3) === 'end' 来检查字符串的结尾?如果是这样——我有一个好消息要告诉你。从 PHP 8.0 开始,该语言引入了两个优雅且直观的函数:str_starts_with() 和 str_ends_with()。

\n\n

在本文中,我们将深入剖析它们。你将了解它们的工作原理、与旧方法的区别,以及为什么应该在每个现代 PHP 项目中使用它们。我们还将探讨开发人员实际生活中的真实示例——从检查 URL 到验证电子邮件以及处理文件路径。

\n\n

什么是 str_starts_with() 和 str_ends_with()?

\n\n

它们是 PHP 8 的内置函数,允许你检查字符串是否以指定的子字符串开头或结尾。它们返回布尔值(true 或 false),这使得它们非常适合在条件语句中使用。

\n\n

以下是它们的基本语法:

\n\n
str_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool
\n\n

其中 $haystack 是你要检查的字符串,而 $needle 是你要在开头或结尾查找的子字符串。

\n\n

简单示例

\n\n
<?php\n$string = "Hello, world!";\n\n// 检查字符串是否以 "Hello" 开头\nif (str_starts_with($string, "Hello")) {\n    echo "字符串以 'Hello' 开头"; // 此代码将执行\n}\n\n// 检查字符串是否以 "world!" 结尾\nif (str_ends_with($string, "world!")) {\n    echo "字符串以 'world!' 结尾"; // 此代码也将执行\n}\n?>
\n\n

很简单,对吧?无需额外计算,无需 === 0 或 strlen()。只需检查并得到结果。

\n\n

为什么这很重要?旧方法的问题

\n\n

在 PHP 8 之前,开发人员不得不使用变通方法。检查字符串开头最流行的方法如下:

\n\n
if (strpos($string, 'prefix') === 0) { ... }
\n\n

这有什么问题呢?strpos() 会在字符串的任何位置查找子字符串,而不仅仅是在开头。是的,检查 === 0 可以排除错误结果,但代码本身并没有说明开发人员的意图。你看着它时会想:“嗯,他是在检查开头……还是只是在查找?”——这降低了可读性。

\n\n

而检查字符串结尾则更不直观:

\n\n
if (substr($string, -3) === 'end') { ... }
\n\n

这里你需要确切知道子字符串的长度(-3),如果你指定了错误的数字,就会导致错误。此外,如果子字符串比字符串本身还长——substr() 只会返回一个空字符串,条件将永远不会成立。

\n\n

新的 str_starts_with() 和 str_ends_with() 函数解决了所有这些问题:

\n
    \n
  • 可读性:代码不言自明。
  • \n
  • 可靠性:无需考虑子字符串的长度或空字符串。
  • \n
  • 性能:这些函数在 PHP 内核层面进行了优化。
  • \n
\n\n

Web 开发中的实际使用示例

\n\n

让我们看看这些函数在实际中可以在哪里派上用场。我挑选了几个你在工作中肯定遇到过的场景。

\n\n

1. 检查 URL 前缀(路由、重定向)

\n\n

假设你正在编写一个简单的路由器,并希望处理以 /admin 开头的 URL:

\n\n
<?php\n$uri = $_SERVER['REQUEST_URI'];\n\nif (str_starts_with($uri, '/admin')) {\n    echo "你在管理面板中";\n    // 加载管理                

博客

书籍推荐