翻转字符串中单词顺序需区分字符翻转与单词翻转:基础法用explode+array_reverse+implode,健壮法用正则提取并保留空白结构,strrev仅翻转字符不可用。

PHP 中翻转字符串中单词的顺序(不是字符顺序),常用方法是先按空格分割成单词数组,再反转数组,最后用空格拼接。关键在于正确处理多个连续空格、首尾空格等边界情况。
基础方法:使用 explode() + array_reverse() + implode()
适用于单词间单个空格、无首尾空格的干净字符串:
$str = "hello world php";
$words = explode(' ', $str);
$reversed = array_reverse($words);
$result = implode(' ', $reversed); // "php world hello"
健壮方法:保留原始空格结构(推荐)
若需保持原字符串中多空格、制表符、换行等空白格式,不能简单用 explode(' ')。应使用正则匹配单词和空白块:
- 用
preg_split('/(\s+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE)拆分,保留分隔符(即各类空白) - 提取所有非空白元素(即单词),反转它们
- 遍历原拆分结果,遇到单词就替换为反转后的单词,遇到空白就原样保留
$str = "a b\tc\n";
$parts = preg_split('/(\s+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$words = array_filter($parts, function($p) { return !ctype_space($p) && $p !== ''; });
$words = array_values($words);
$reversedWords = array_reverse($words);
$i = 0;
$result = '';
foreach ($parts as $part) {
if (!ctype_space($part) && $part !== '') {
$result .= $reversedWords[$i++];
} else {
$result .= $part;
}
}
// 结果:"c b\ta\n" —— 单词翻转,空白结构不变
简洁替代:用 strrev()?注意误区
strrev() 翻转的是整个字符串的字符顺序,不是单词顺序。例如:strrev("hello world") 得到 "dlrow olleh",这不是目标结果。务必区分“翻转单词”和“翻转字符”。
立即学习“PHP免费学习笔记(深入)”;
一行函数封装(兼顾简洁与健壮)
定义一个可复用函数,自动处理常见空白:
function reverseWords($str) {
$words = preg_match_all('/\S+/', $str, $matches) ? $matches[0] : [];
$reversed = array_reverse($words);
return preg_replace_callback('/\S+/', function($m) use (&$reversed) {
static $i = 0;
return $reversed[$i++];
}, $str);
}
echo reverseWords(" one two\tthree "); // " three two\tone "











