回文判断需先清洗字符串(保留字母数字并转小写),再用双指针或反转法比对。空串、纯符号、大小写混合等边界情况均需正确处理。

判断一个字符串是否为回文,核心是:忽略大小写和非字母数字字符后,正读和反读完全一致。
基础思路:清洗 + 双指针比较
先过滤掉空格、标点、大小写差异等干扰,再用头尾两个指针向中间靠拢比对。
- 用 preg_replace('/[^a-zA-Z0-9]/', '', $s) 提取仅含字母和数字的子串
- 用 strtolower() 统一转小写
- 设置左指针 $left = 0,右指针 $right = strlen($clean) - 1
- 循环中比较 $clean[$left] === $clean[$right],不等则返回 false;相等则 $left++、$right--,直到左 >= 右
更简洁写法:反转对比
适合短字符串或对性能要求不高的场景,代码直观易懂。
- 清洗并小写化后得到 $clean
- 用 strrev($clean) 得到反转字符串
- 直接返回 $clean === strrev($clean)
注意边界情况
空字符串、单字符、纯符号(如 "!!")、只有数字(如 "121")都应正确处理。
立即学习“PHP免费学习笔记(深入)”;
- 空字符串 "" 是回文(清洗后仍为空,反转也为空)
- 只含非字母数字字符(如 "!@#")清洗后为空,判为回文
- 大小写混合(如 "A man a plan a canal Panama")清洗小写后为 "amanaplanacanalpanama",是回文
完整可运行示例
// 示例函数
function isPalindrome($s) {
$clean = strtolower(preg_replace('/[^a-zA-Z0-9]/', '', $s));
$left = 0;
$right = strlen($clean) - 1;
while ($left
if ($clean[$left] !== $clean[$right]) {
return false;
}
$left++;
$right--;
}
return true;
}











