我需要一种方法来根据URL中的语言包含一个php文件。现在这个脚本正在运行,但是当我有10或20种语言时,我想要一些较短的脚本,它仍然包含相同的信息。问题是,如果URL中的'lg'更改为不存在的语言,我想使用英语。
$langue=$_GET['lg'];
if ($langue == "da")
{ include"da.php";}
elseif ($langue == "de")
{ include"de.php";}
elseif ($langue == "en")
{ include"en.php";}
elseif ($langue == "es")
{ include"es.php";}
else { include"en.php";}
有人可以缩短这个吗?
答案 0 :(得分:5)
if (empty($_GET['lg'])) {
$lang = "en";
} else {
$lang = $_GET['lg'];
}
if ( !preg_match('~^[a-z]{2}$~',$lang) ) {
header('HTTP/1.1 403 Forbidden');
exit;
}
$langfile = "$lang.php";
if (!is_readable($langfile)) {
$lang = "en";
$langfile = 'en.php';
}
include $langfile;
答案 1 :(得分:1)
只需使用:
$lang = (file_exists($_GET['lg'] . '.php')) ? $_GET['lg'] . '.php' : 'en.php';
include($lang);
编辑:根据评论,我应该指出,这段代码虽然功能简洁,但确实非常容易受到恶意攻击,基本上任何人都可以将URL变量设置为配置或其他敏感文件,然后对您的网站发起攻击,或窃取您的数据。因此,请确保在调用include之前验证$lang
变量 - 可能只需要简单:
$allowed = array('en.php', 'fr.php');
if(in_array($lang, $allowed)){
include($lang);
}
答案 2 :(得分:1)
<?php
$languages = array('da', 'de', 'en', 'es');
$lang = 'en';
if(!empty($_GET['lg']) && array_search($_GET['lg'], $languages) !== false) {
$lang = $_GET['lg'];
}
include $lang.'.php';
?>
答案 3 :(得分:0)
这样的事情怎么样?
if(isset($_REQUEST['lg']) && $_REQUEST['lg'] != '') $lg = $_REQUEST['lg'];
if(strstr($lg, '.')) die('Don\'t allow any . in the languages');
if(file_exists('path_to_language_files/'.$lg.'.php') {
include('path_to_language_files/'.$lg.'.php');
} else {
include('path_to_language_files/en.php');
}
答案 4 :(得分:0)
我有一个只使用两种语言的页面,但是我需要将它打开以添加更多等等,我解决了同样的问题:
$allowed=array("da","de","en","es");
$default="de.php";
include(array_search($_GET["lg"],$allowed) === false ? $default : $allowed[array_search($_GET["lg"] , $allowed)].".php");
它应该可以类似地工作,除了你可以指定允许哪些文件,并且它们的名字是从数组中获取的,所以它应该是安全的假请求。