如何在PHP中获取字符串的最后一个字符:5种经过验证的方法

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

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

开始课程

如何在PHP中获取字符串的最后一个字符:面向新手和专家的完整指南

\n\n

想象一下这个场景:您正在编写一个脚本,需要检查电子邮件是否以 @gmail.com 结尾,或者您需要提取用户名的最后一个字母。这看起来是一项简单的任务——在PHP中获取字符串的最后一个字符。但事实并非如此!即使在这个简单的问题中,也隐藏着许多陷阱,尤其是在处理俄语、表情符号或特殊字符时。

\n\n

根据 Stack Overflow 的数据,问题 "How to get the last char of a string in PHP?" 每月获得数千次浏览。这并非偶然:新手经常在使用带负索引的 substr() 时犯错,而经验丰富的开发者则在争论性能以及正确处理 UTF-8 的问题。

\n\n

在本文中,我们将探讨5种可行的方法,展示真实的代码示例,并给出明确的建议。我们开始吧!

\n\n

方法 #1:经典方法——使用负索引的 substr()

\n\n

最流行且最简洁的方法。substr() 函数接受一个负的长度值,以便从字符串末尾开始计数字符。

\n\n
<?php\n$string = "Hello, World!";\n$lastChar = substr($string, -1);\necho $lastChar; // 输出:!\n?>
\n\n

优点:

\n
    \n
  • 简短明了
  • \n
  • 运行速度快
  • \n
\n\n

缺点:

\n
    \n
  • 不支持多字节编码(西里尔字母、象形文字)
  • \n
  • 对于 UTF-8 字符串,可能返回“损坏的”字符
  • \n
\n\n

西里尔字母的问题示例:

\n\n
<?php\n$string = "Привет";\n$lastChar = substr($string, -1);\necho $lastChar; // 输出:�(菱形问号)\n?>
\n\n

为什么会这样?因为俄语字母在 UTF-8 中占用2个字节,而 substr() 处理的是字节,而不是字符。对于英文文本,这种方法很理想,但对于多语言项目则不然。

\n\n

方法 #2:正确方法——用于多字节字符串的 mb_substr()

\n\n

如果您的项目使用 Unicode(如今这几乎是必须的),请使用来自 mbstring 扩展的 mb_substr()。

\n\n
<?php\n$string = "Привет, мир!";\n$lastChar = mb_substr($string, -1);\necho $lastChar; // 输出:!\n?>
\n\n

现在来看最有趣的部分——处理表情符号:

\n\n
<?php\n$string = "👋 Привет 🌍";\n$lastChar = mb_substr($string, -1);\necho $lastChar; // 输出:🌍\n?>
\n\n

优点:

\n
    \n
  • 正确处理任何编码(UTF-8、UTF-16 等)
  • \n
  • 处理表情符号和特殊字符
  • \n
\n\n

缺点:

\n
    \n
  • 需要安装 mbstring 扩展(几乎所有主机都提供)
  • \n
  • 比 substr() 稍慢
  • \n
\n\n

方法 #3:替代方法——str_split() 和 end()

\n\n

可以将字符串拆分为字符数组,然后取最后一个元素。看起来优雅,但有一个注意事项。

\n\n
<?php\n$string = "PHP";\n$chars = str_split($string);\n$lastChar = end($chars);\necho $lastChar; // 输出:P\n?>
\n\n

注意: str_split() 也不适用于多字节字符串。对于西里尔字母,需要使用带有 Unicode 标志的 preg_split():

\n\n
<?php\n$string = "Код";\n$chars = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);\n$lastChar = end($chars);\necho $lastChar; // 输出:д\n?>
\n\n

优点:

\n
    \n
  • 代码直观易懂
  • \n
  • 不仅可以轻松获取最后一个字符,还可以获取任何字符
  • \n
\n\n

缺点:

\n
    \n
  • 内存消耗过大(创建了一个数组)
  • \n
  • 比直接函数慢
  • \n
\n\n

方法 #4:高级方法——用于特定编码的 iconv_substr()

博客

书籍推荐