Экранирование HTML-тегов в строке Smalltalk
Я отчаянно пытаюсь написать очень простой метод в Smalltalk, чтобы избежать HTML-тегов ('').
До сих пор это то, что я придумал:
escapeHtml: str
|tags newString tmpString|
newString := String new.
tags := Dictionary new.
tags at: '<' put: '<'.
tags at: '>' put: '>'.
tags keysAndValuesDo:
[ :k :v |
tmpString := str copyReplaceAll: k with: v.
newString := tmpString
].
^newString
!
К сожалению, он, по-видимому, заменяет только самый последний пункт словаря tags
. Что я делаю не так? Вероятно, я должен также отметить, что у меня очень мало опыта в Smalltalk.
Интерпретатор выбора - это "Сикс".1 ответ:
Я думаю, что вы хотели сделать что-то вроде
newString := str
, а затем в блоке
keysAndValuesDo:
:tmpString := newString copyReplaceAll: k with: v.
Потому что прямо сейчас вы генерируете
tmpString
для каждой пары ключ/значение с заменой только одного ключа. Чем вы назначаете егоnewString
. Для достижения поставленной цели необходимо отправитьcopyReplaceAll:
в строку, обработанную на предыдущей итерации. Это можно сделать, отправив сообщение вnewString
, но для того, чтобы первая итерация работала, вы должны присвоить значениеstr
оно.P.S. Я также думаю, что эта более чистая версия должна работать:
escapeHtml: str |tags newString| newString := str copy. ... tags keysAndValuesDo: [ :k :v | newString replaceAll: k with: v ]. ^newString