较短的语言检测

时间:2012-04-29 14:09:23

标签: php url

我需要一种方法来根据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";}

有人可以缩短这个吗?

5 个答案:

答案 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");

它应该可以类似地工作,除了你可以指定允许哪些文件,并且它们的名字是从数组中获取的,所以它应该是安全的假请求。