У меня есть текстовое поле в моей форме Drupal, которое мне нужно очистить перед сохранением в базу данных. Поле предназначено для произвольного имени, и я ожидаю, что некоторые пользователи, возможно, захотят написать, например, «Энди» или «Дом Джона».
Проблема в том, что когда я запускаю значение поля через функцию check_plain (), апостроф преобразуется в » ‘, что означает, что «код Энди» становится «кодом Энди».
Могу ли я как-то исключить апостроф из функции check_plain (), или иным образом справиться с этой проблемой. Я попытался обернуть в функцию format_string (), но она не работает:
$nickname = format_string(check_plain($form_state['values']['custom_name'], array(''' => "'")));
Благодарю.
Нет, вы не можете исключить обработку некоторых символов в 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');
но это может вызвать некоторые проблемы с безопасностью.
Другой вариант — написать пользовательское регулярное выражение для правильной очистки вашего ввода.
Я был немного обеспокоен упомянутой проблемой безопасности 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);