You are here

Drupal专业开发指南 第20章 使用check_plain()和t()来清理输出

g089h515r806 的头像
Submitted by g089h515r806 on 星期四, 2009-08-27 13:02

当你对你用到的文本不信任,并且你不想在文本中有任何markup(标识字体)时,那么就可以使用check_plain()。

下面是使用用户输入的原始方式,假定用户刚刚在一个文本输入框中输入了一个喜欢的颜色。
下面的代码不安全:
 
drupal_set_message("Your favorite color is $color!"); // No input checking!
 
下面的代码安全,但不是最佳实践:
 
drupal_set_message('Your favorite color is ' . check_plain($color));
 
这段代码不好,这是因为它没有把这个文本字符串(这里指的是check_plain()函数输出的结果)放到t()中,对于文本字符串总是需要调用该函数的。如果你像上面这样编写代码,那你就等着挨骂吧,翻译者将不能够翻译你的语句,因为它没有使用t()函数。
你不能将变量直接放到双引号中,并将它们传递给t()。下面的代码仍然不安全,因为它没有使用占位符:
 
drupal_set_message(t("Your favorite color is $color!")); // No input checking!
 
t()函数提供了一种内置的方式用来确保你的字符串的安全性,使用一个带有单字符前缀的占位符,如下所示。
下面的代码很安全并且格式良好:
 
drupal_set_message(t('Your favorite color is @color', array('@color' => $color));
 
    注意数组中的键(@color)与字符串中的占位符完全相同。消息的结果如同下面的这样:
 
Your favorite color is brown.
 
前缀@告诉t(),要对替换占位符的值调用check_plain()。
 
注意 当运行一个Drupal 的t()函数时,将对占位符的值调用check_plain(),对于其它的字符串则不调用check_plain()。所以你需要信任你的翻译者。
 
在这里,我们可能想通过改变颜色值的样式,来强调用户所选择的颜色。使用%前缀可以达成所愿,它意味着“对于该值执行theme('placeholder', $value)”。它间接的将值传递给了check_plain(),如图20-1所示。前缀%是最常用的前缀。
 
       下面的代码是安全的并且格式良好:
 
drupal_set_message(t('Your favorite color is %color', array('%color' => $color));
 
一个消息产生的结果如下所示。使用theme_placeholder()对该值进行了主题化,它简单的使用了<em></em>标签对值进行了包装。
 
Your favorite color is brown.
 
    如果你的文本在前面已被清理过了,你可以使用前缀!来禁用t()中的检查。例如,l()函数构建了一个链接,在构建链接时,它通过check_plain()处理了链接文本。所以在下面的例子中,可以安全的使用前缀!:
 
// l() function runs text through check_plain() and returns sanitized text
// so no need for us to do check_plain($link) or to have t() do it for us.
$link = l($user_supplied_text, $path);
drupal_set_message(t('Go to the website !website', array('!website' => $link));
 
注意 除非你通过在选项参数中将html设置为TRUE,以对l()指示链接文本已经是HTML格式了,否则l()函数仍然将链接文本通过check_plain()进行处理。参看http://api.drupal.org/api/function/l/6
 
t()函数中,用于字符串替换的@, %, 和 !占位符的作用,如图20-1所示。在该图中我们是用了一个简单的例子进行说明,记住你可以在字符串中使用多个占位符并将它们添加到数组中,例如:
 
drupal_set_message(t('Your favorite color is %color and you like %food',
array('%color' => $color, '%food' => $food)));
 
使用前缀!时要小心一点,因为该字符串没有经过check_plain()处理。
 
20-1 字符串替换时,不同占位符前缀的作用
 老葛的Drupal培训班 Think in Drupal

Drupal版本: