Исключить символы из check_plain () в форме Drupal

У меня есть текстовое поле в моей форме Drupal, которое мне нужно очистить перед сохранением в базу данных. Поле предназначено для произвольного имени, и я ожидаю, что некоторые пользователи, возможно, захотят написать, например, «Энди» или «Дом Джона».

Проблема в том, что когда я запускаю значение поля через функцию check_plain (), апостроф преобразуется в » ‘, что означает, что «код Энди» становится «кодом Энди».

Могу ли я как-то исключить апостроф из функции check_plain (), или иным образом справиться с этой проблемой. Я попытался обернуть в функцию format_string (), но она не работает:

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

Благодарю.

2

Решение

Нет, вы не можете исключить обработку некоторых символов в 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');

но это может вызвать некоторые проблемы с безопасностью.

Другой вариант — написать пользовательское регулярное выражение для правильной очистки вашего ввода.

1

Другие решения

Я был немного обеспокоен упомянутой проблемой безопасности 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;
}

И пример вызова:
$ nickname = my_sanitize ($ nickname);

0

По вопросам рекламы [email protected]