在 PHP 開發中,經常需要處理字符串中的連續重複字符,例如將多個空格合併為一個、將連續的特定字符簡化等。本文將介紹五種不同的實現方法,從正則表達式到循環遍歷,幫助你根據場景選擇最合適的方案。
最常見的場景是將字符串中的任意連續空白字符(空格、制表符、換行符等)替換為單個空格:
<?php
$str1 = 'A B C ';
echo preg_replace("/\s+/", ' ', $str1);
// 輸出: A B C
?>
\s+ 匹配一個或多個空白字符,將其替換為單個空格。
如果只需要處理特定字符(如 'M'),可以直接在正則中指定:
<?php
$str1 = 'AMMMBMMMMCMM ';
echo preg_replace("/M+/", 'M', $str1);
// 輸出: AMBMMCM
?>
不使用正則,通過雙層循環實現任意連續字符去重:
<?php
$str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
$str2 = '';
for ($i = 0; $i < strlen($str1); $i++) {
$str2 .= $str1[$i];
$j = 1;
while ($str1[$i] == $str1[$i + $j]) {
$j++;
}
$i = $i + $j - 1;
}
echo $str2;
// 輸出: ACB CG O YFXZ
?>
這種方法通過內層 while 循環跳過連續相同的字符,外層 for 循環控制主索引。
只需單次遍歷,記錄上一字符進行比較:
<?php
$str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
$len = strlen($str1);
$str2 = $str1[0];
$ch = $str2;
for ($i = 1; $i < $len; $i++) {
$ch2 = $str1[$i];
if ($ch != $ch2) {
$str2 .= $ch2;
$ch = $ch2;
}
}
echo $str2;
// 輸出: ACB CG O YFXZ
?>
這種方法時間複雜度為 O(n),比雙層循環更高效,推薦在不使用正則時使用。
利用正則捕獲組和回引用 \1 實現:
<?php
$str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ';
echo preg_replace("/(.)\1+/", "\1", $str1);
// 輸出: ACB CG O YFXZ
?>
(.) 捕獲任意單字符,\1+ 匹配該字符連續出現一次或多次,替換為捕獲的單字符 \1。這是代碼最簡潔、性能也較好的方案。
preg_replace("/(.)\1+/", "\1", $str),一行代碼解決問題preg_replace("/字符+/", "字符", $str)掌握這些方法,能讓你在處理字符串去重需求時遊刃有餘。