2015-08-17 4 views
4

Мне нужно сделать очень быстрый n-грязный входной дезинфекции, и я хотел бы в основном преобразовать все <, > в &lt;, &gt;.Python Input Sanitization

Я хотел бы достичь тех же результатов, что и '<script></script>'.replace('<', '&lt;').replace('>', '&gt;'), не перебирая строку несколько раз. Я знаю о maketrans в сочетании с str.translate (то есть http://www.tutorialspoint.com/python/string_translate.htm), но это только преобразует от 1 символа в другой символ. Другими словами, никто не может сделать что-то вроде:

inList = '<>' 
outList = ['&lt;', '&gt;'] 
transform = maketrans(inList, outList) 

Есть builtin функция, которая может сделать это преобразование в одной итерации?

Я хотел бы использовать возможности builtin в отличие от внешних модулей. Я уже знаю о Bleach.

+0

Почему не просто перебирать вручную? – Kevin

+0

В этом случае вам кажется, что вы действительно хотите кодировать символы в HTML, пожалуйста, проверьте http://stackoverflow.com/questions/701704/convert-html-entities-to-unicode-and-vice-versa – Nicolas78

+0

См. Https://stackoverflow.com/questions/6116978/python-replace-multiple-strings для замены нескольких строк в целом. – augurar

ответ

9

Вы можете использовать cgi.escape()

import cgi 
inlist = '<>' 
transform = cgi.escape(inlist) 
print transform 

Выход:

&lt;&gt; 

https://docs.python.org/2/library/cgi.html#cgi.escape

cgi.escape (s [, цитата]) Преобразовать символы '&', '< 'и'> 'в строка s для безопасного для HTML секвена цы. Используйте это, если вам нужно отобразить текст , который может содержать такие символы в HTML. Если дополнительный флаг котировка верно, символ кавычки (") также переводится, это помогает для включения в значении атрибута HTML, ограниченное двойной кавычки, как в Обратите внимание, что одинарные кавычки никогда не переведены

..
1

вы можете определить свою собственную функцию, которая перебирает струны один раз и заменяет любые символы, которые вы определите.

def sanitize(input_string): 
    output_string = '' 
    for i in input_string: 
     if i == '>': 
      outchar = '&gt;' 
     elif i == '<': 
      outchar = '&lt;' 
     else: 
      outchar = i 
     output_string += outchar 
    return output_string 

Затем вызова

sanitize('<3 because I am > all of you') 

дает

'&lt;3 because I am &gt; all of you' 
+2

действительно взгляните на string.join и узнайте список! – Nicolas78

+1

Использование + со строками квадратично, потому что каждый раз он строит новую строку. Я думаю, что CPython может оптимизировать это в линейной операции, но другие реализации, такие как PyPy, могут быть недоступны. – Kevin

+0

ВАЖНО: при сканировании собственного сатизера всегда используйте явный список. Если какие-либо символы НЕ входят в набор вещей, вы разрешаете либо a) поднять ошибку, либо b) удалить ее или c) заменить нейтральным символом какого-либо типа ... IE: 'else if i in set (string. ascii_letters + string.ascii_digits): ... ' –