Eval()只有我知道的方式,还有其他吗?

时间:2013-08-15 22:54:49

标签: php internationalization

我的语言文件包含网站内容的翻译 每种不同的语言都会加载不同的文件。

现在我希望有类似的内容,我需要在页面上回显并包含在form发送的电子邮件中提交:

$lang["booking_mail_header"]='Dear '.$first_name.', thank you for your contact!';

此处的问题是$lang[]在定义$first_name之前加载,而$first_name是用户输入的内容,因此不安全。

我考虑过使用eval()然后再想一想,却没有。还有另一种方式吗?

脚本这一点的变量已经通过了这个正则表达式检查:
 preg_match('/^[a-öA-Ö0-9-. ]*$/', $first_name)

1 个答案:

答案 0 :(得分:4)

你可以把它变成一个模板,例如

$lang["booking_mail_header"]='Dear %s, thank you for your contact!';

然后将其与sprintf

一起使用
$msg=sprintf($lang["booking_mail_header"], $first_name);

您也可以更聪明,并使用编号参数,这将允许您的模板将输入重新排序为sprintf,例如。

  $lang["format_name"]='%2$s, %1$s';

  $msg=sprintf($lang["format_name"], $first_name, $last_name);

一旦你理解了这一点,考虑使用gettext,它使用相同的基本思想,但将其包含在一些标准工具中,这有助于保持翻译。使用它,你不会在数组中保留翻译,你只需将自然语言包装在_()包装器中,例如。

$msg=sprintf(_('Dear %1$s, thank you for your contact!'), $first_name);

gettext tools可以将_()函数包含的自然语言提取到单独的文件中进行翻译。翻译人员会使用poedit之类的标准工具来制作这些翻译。在运行时,您选择此文件的相应翻译版本,_()将返回该翻译。