Определить, является ли строка закодированным HTML через jQuery?
Я работаю над сценарием проверки, но сталкиваюсь с очень конкретной проблемой.
Если пользователь вводит строку, которая оказывается кодированным символом HTML (например, &
или же &
), он будет выводиться как символ (и в этом случае). У меня такой вопрос: возможно ли написать функцию, которая определяет, является ли строка закодированным символом? Поэтому, если пользователь вводит один из двух вышеупомянутых параметров, я хочу запустить определенную функцию, а если это не закодированный символ, я хочу сделать что-то еще.
Есть ли способ сделать это?
3 ответа
По определению, если вы не знаете, является ли что-то закодированным объектом HTML или нет, вы не знаете. Либо вы рассматриваете весь текст, поступающий из определенного источника, как закодированный или не закодированный. Зачем? Потому что это всего лишь текст. "& Амп;" это просто текст. Я хотел написать "& amp;" Вот. Я не хочу, чтобы кто-то истолковывал это, я хочу, чтобы оно буквально отображалось как "& amp;".
Как вы знаете, что имел в виду пользователь? Если вы начинаете заменять введенный пользователем текст, основываясь на догадках, в некоторых случаях вы всегда облажаетесь. Это типичный случай, когда все ":D" заменены графическим смайликом, который раздражает, когда вы на самом деле хотели набрать ":D".
Если вы хотите всегда сохранять именно то, что ввел пользователь, всегда выполняйте весь ввод пользователя через функцию кодирования HTML, которая заменяет все специальные символы на сущности. См . Великий эскапизм (или: что нужно знать, чтобы работать с текстом внутри текста).
Вы можете проверить, содержит ли строка закодированные символы, сравнив закодированные и декодированные длины:
var string = "Your encoded & decoded string here"
function decode(str){
return decodeURIComponent(str).replace(/</g,'<').replace(/>/g,'>');
}
if(string.length == decode(string).length){
// The string does not contain any encoded html.
}else{
// The string contains encoded html.
}
Кроме того, это значительно быстрее, чем предложенный метод jQuery.
Что-то вроде этого сделало бы это.
function containsEncoded (val){
var rHTMLEncoded = /&[^\s]*/;
return rHTMLEncoded.test(val) ;
}
// Usage
var encoded = containsEncoded("&");