方法一:使用 str_replace 的简单高效实现
核心思路
在这类需求中,直接替换元音字符为空字符串的思路最直观、实现最简单。对于 ASCII 字符集的文本,无需正则引擎开销,性能通常十分出色,尤其适合短文本和大量调用的场景。
该方法的关键点在于明确元音集合并一次性替换,避免逐字符处理带来的分支和循环成本。对输入字符串的结构要求不高,适用于包含标点和数字的混合文本。
实现时需要确保 覆盖大小写元音,否则会遗漏部分字符,通常会将元音集合设为区分大小写的数组或映射,以确保稳定性。
注意点:该实现仅处理 ASCII 字母的元音,若文本包含带音标的元音或其他语言的元音,需要扩展元音集合或改用另一种实现方式。
方法二:使用正则表达式 preg_replace(对 ASCII 元音)
核心思路
第二种实现通过正则表达式直接匹配并移除元音字符,对大段文本更为灵活,且可以轻松扩展到更复杂的字符集。开启 UTF-8 模式(使用 nudge 的 u 标志)能够正确处理多字节文本。
该方法的要点在于设计合理的字符类,确保只匹配目标元音,同时利用单次替换完成任务,避免逐字符遍历带来的额外开销。
在处理混合文本时,正则表达式的可读性和可维护性强,但对于极端性能敏感场景,正则可能不如直接替换高效。
注意事项:该方法对带有变音符号的元音(如 á, é, ö 等)不会被去除,除非将它们也加入到正则字符集,或采用其他更广义的匹配策略。
方法三:逐字符遍历 + mbstring 的自定义实现
核心思路
当文本包含多字节字符、需要对 Unicode 场景进行更严格控制时,逐字符遍历并借助 mbstring 库进行分离与判断是一个稳健的方案。该方法对多字节文本友好,且易于扩展为自定义规则,例如保留某些特殊字符、或处理特定语言的元音集合。

实现的核心在于使用 mb_strlen/mb_substr 按字符处理,以及通过一个简短的字母表快速判定是否为元音,确保逻辑清晰且可维护。
该策略适合需要对文本进行严格的逐字符控制的场景,尽管在极大文本量时性能不如方法一、方法二,但在多字节文本场景具有明显优势。
true,'e'=>true,'i'=>true,'o'=>true,'u'=>true];$out = '';$len = mb_strlen($s, 'UTF-8');for ($i = 0; $i < $len; $i++) {$ch = mb_substr($s, $i, 1, 'UTF-8');$lc = mb_strtolower($ch, 'UTF-8');if (!isset($vowels[$lc])) {$out .= $ch;}}return $out;
}// 示例
$text = "PHP 字符串元音去除示例:This is a test.";
echo removeVowelsMbIterative($text);
?>
扩展性:如需去除带音标的元音,可以把 $vowels 的集合扩展为包含 à, é, ö 等等,或者通过额外的正则匹配阶段统一处理。该实现也需要确保服务器上已启用 mbstring 扩展以保证正确处理 UTF-8。


