Дарт дезинфицировать международный текст
Как лучше всего продезинфицировать текст как
abc' a>b<c & a<b>c
преобразования / отображения
abc' a>b≤c & a≤b>c
или открытым текстом
abc' a>b<c & a<b>c
так что я могу использовать его через
myDiv.innerHtml=... or
myDiv.setInnerHtml(..., myValidator, mySantitizer);
Текстовое задание myDiv.text=...
преобразует все & и <> устраняя действительный апостроф '
- класс / метод HtmlEscape.convert (..) также преобразует все и во все HtmlEscapeMode.
Могли бы написать свой собственный Sanitizer, но надеюсь, что я упустил какую-то стандартную библиотеку / вызов.
2 ответа
import 'dart:html';
import 'dart:convert';
void main() {
String htmlStr = r'abc' a>b<c & a<b>' * 3;
var reg = new RegExp(r"(.*?)(&#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+;)|(.*)");
List<Match> matchs = reg.allMatches(htmlStr);
var resStr = '';
matchs.forEach((m) {
var g1 = m.group(1);
var g2 = m.group(2);
var g3 = m.group(3);
g1 = HTML_ESCAPE.convert(g1 == null ? '' : g1);
g2 = g2 == null ? '' : g2;
g3 = HTML_ESCAPE.convert(g3 == null ? '' : g3);
resStr += g1 + g2 + g3;
});
print(resStr);
document.body.setInnerHtml(resStr);
}
Подумав немного, я понял, что использование Validators или HtmlEscape / Mode не лучший способ решения проблемы.
Первоначальная проблема заключалась в том, что механизмы перевода используют & # 39; для апострофов - вероятно, не следует путать это с неправильным использованием апострофов как единой цитаты.
Таким образом, лучшим решением является замена & # 39; с правильным символом Unicode для апострофа, который на самом деле
- НЕ "\u{0027}" = ' = апостроф юникода - отображается как (прямая) одинарная кавычка
- НЕ "\u{2019}" = '= Юникод правая одинарная (фигурная) кавычка - см. http://www.fileformat.info/info/unicode/char/2019/index.htm
- но "\u{02BC}" = ʼ = апостроф буквы модификатора - отображается как фигурная кавычка - см. http://www.fileformat.info/info/unicode/char/02BC/index.htm
(Правильный) апостроф U+0027 & # 39; это неправильно, поскольку шрифты символов печатают это (неправильно) прямо - что графические парни действительно ненавидят - как прямой ".
Таким образом, вы можете назначить переведенный текст элементу element.text, и, если он содержит проблемные символы, они автоматически экранируются с помощью Dart - и отображаются очень хорошо.