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

vktxenjb  于 2023-02-28  发布在  PHP
关注(0)|答案(2)|浏览(120)

我的Drupal表单中有一个文本字段,在保存到数据库之前需要进行清理,该字段用于自定义名称,我预计有些用户可能希望写入例如“Andy 's”或“John' s home”。
问题是,当我通过check_plain()函数运行字段值时,撇号被转换为'-这意味着Andy's code变成了Andy's code
我可以从check_plain()函数中排除撇号,或者用其他方法来处理这个问题吗?我尝试过在format_string()函数中进行 Package ,但是不起作用:

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

谢谢。

ovfsdjhp

ovfsdjhp1#

不,你不能排除处理check_plain()中的某个字符,因为它只是将你的文本传递给php函数htmlspecialchars(),并带有ENT_QUOTES标志:

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

ENT_QUOTES意味着htmlspecialchars()将把双引号和单引号都转换成HTML实体。

除了check_plain(),你可以使用htmlspecialchars()和ENT_COMPAT(这样它就不会使用单引号):

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

但这会引起一些安全问题。
另一种选择是编写自定义正则表达式来正确地净化输入。

ct3nt3jp

ct3nt3jp2#

我一直有点担心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;
 }

一个示例调用是:$昵称=我的消毒($昵称);

相关问题