以 Drupal 形式从 check_plain() 中排除字符

Exclude characters from check_plain() in Drupal form

我的 Drupal 表单中有一个文本字段,我需要在将其保存到数据库之前对其进行清理。该字段用于自定义名称,我希望某些用户可能希望编写例如 "Andy's" 或 "John's home"。

问题是,当我通过 check_plain() 函数 运行 字段值时,撇号被转换为 ''' - 这意味着 "Andy's code" 变为 "Andy's code"。

我能否以某种方式从 check_plain() 函数中排除撇号,或者以其他方式处理这个问题。我试过在 format_string() 函数中包装,但它不起作用:

$nickname = format_string(check_plain($form_state['values']['custom_name'], array(''' => "'")));

谢谢。

不,您不能使用 ENT_QUOTES 标志排除对 check_plain(), because it's simply passes your text to php function htmlspecialchars() 中某些字符的处理:

function check_plain($text) {
  return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

ENT_QUOTES 表示 htmlspecialchars() 会将双引号和单引号都转换为 HTML 个实体。

您可以将 htmlspecialchars() 与 ENT_COMPAT 一起使用,而不是 check_plain() (因此它会单独留下单引号):

htmlspecialchars($text, ENT_COMPAT, 'UTF-8');

但这可能会导致一些安全问题。

另一种选择是编写自定义正则表达式以正确清理您的输入。

我一直有点担心提到的 T-34 安全问题,所以我尝试编写一个似乎工作正常的变通函数。该函数删除撇号,然后在每个部分上运行 check_plain(),然后将其重新组合在一起,重新插入撇号。

函数是:

function my_sanitize ($text) {
  $clean = '';
  $no_apostrophes = explode("'", $text);
  $length = count($no_apostrophes);
  if($length > 1){
    for ($i = 0; $i < $length; $i++){
      $clean .= CHECK_PLAIN($no_apostrophes[$i]);
      if($i < ($length-1)){
         $clean .= "'";  
      }
    }
  }
  else{
    $clean = CHECK_PLAIN($text);
  }  
  return $clean;
 }

调用示例如下: $昵称 = my_sanitize($昵称);