以 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($昵称);
我的 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($昵称);