PHP网站多语言菜单功能异常,请求排查逻辑问题
PHP多语言菜单问题修复
原代码核心问题
- 默认语言未处理:当URL无语言前缀时,
$current_language为空,后续调用$languages[$current_language]会触发数组键不存在的错误,导致str_replace无法执行。 - URL匹配逻辑不严谨:
strpos(..., $selector) === 0仅匹配前缀完全一致的情况,无法兼容/en(无结尾斜杠)或/en/about/这类URL;同时str_replace会替换URL中所有出现的语言前缀,而非仅开头部分。 - 语言名称错误:
es对应的名称写为"Spain"(国家名),应改为"Spanish"(语言名)。
修复后的代码
<?php $languages = array( "en" => array("name" => "English", "selector" => "/en/", "image" => "en.png"), "fr" => array("name" => "French", "selector" => "/fr/", "image" => "fr.png"), "de" => array("name" => "German", "selector" => "/de/", "image" => "de.png"), "it" => array("name" => "Italian", "selector" => "/it/", "image" => "it.png"), "si" => array("name" => "Slovene", "selector" => "/si/", "image" => "si.png"), "es" => array("name" => "Spanish", "selector" => "/es/", "image" => "es.png") ); $current_url = $_SERVER['REQUEST_URI']; $current_language = "en"; // 预设默认语言为英文 // 匹配当前URL的语言前缀 foreach ($languages as $code => $language) { // 用正则匹配开头的语言前缀,兼容/en、/en/xxx等格式 if (preg_match("#^" . preg_quote($language['selector'], '#') . ".*#", $current_url)) { $current_language = $code; break; } } // 生成对应语言的跳转URL function getLanguageUrl($currentUrl, $currentLangSelector, $targetLangSelector) { if ($currentLangSelector === $languages['en']['selector']) { // 默认语言URL无前缀,直接添加目标语言前缀 return $targetLangSelector . ltrim($currentUrl, '/'); } else { // 替换开头的当前语言前缀为目标前缀 return preg_replace("#^" . preg_quote($currentLangSelector, '#') . "#", $targetLangSelector, $currentUrl); } } ?> <div id="language-menu"> <ul> <?php foreach($languages as $code => $language){ $current_selector = $languages[$current_language]['selector']; $new_url = getLanguageUrl($current_url, $current_selector, $language['selector']); if($code === $current_language){ echo '<li class="active">'.$language['name'].'</li>'; } else { echo '<li><a href="'.$new_url.'">'.$language['name'].'</a></li>'; } } ?> </ul> </div>
关键修复说明
- 默认语言兜底:初始化
$current_language为默认语言,避免空键报错。 - 正则精准匹配:用
preg_match匹配开头的语言前缀,兼容多种URL格式,同时用preg_quote转义特殊字符,避免正则语法冲突。 - 定向URL替换:自定义函数区分默认语言和带前缀URL的处理逻辑,确保仅替换开头的语言前缀,不会误改URL中间内容。
- 修正语言名称:将
es的名称改为规范的语言名Spanish。
内容的提问来源于stack exchange,提问作者kezers
相关产品推荐
相关产品推荐

