Smalltalk字符串中的转义HTML标记

Smalltalk字符串中的转义HTML标记,smalltalk,html-encode,Smalltalk,Html Encode,我正在拼命尝试在Smalltalk中编写一个非常基本的方法来逃避HTML标记(“”) 到目前为止,我的想法是: escapeHtml: str |tags newString tmpString| newString := String new. tags := Dictionary new. tags at: '<' put: '&lt;'. tags at: '>' put: '&gt;'. tags keysAnd

我正在拼命尝试在Smalltalk中编写一个非常基本的方法来逃避HTML标记(“”)

到目前为止,我的想法是:

escapeHtml: str
    |tags newString tmpString|
    newString := String new.
    tags := Dictionary new.
    tags at: '<' put: '&lt;'.
    tags at: '>' put: '&gt;'.
    tags keysAndValuesDo:
    [ :k :v |
        tmpString := str copyReplaceAll: k with: v.
        newString := tmpString
    ].
    ^newString
!
escapeHtml:str
|标记新闻字符串tmpString|
newString:=字符串新建。
标记:=字典新建。
位于“”的标记放置:“”。
标记键和值DO:
[:k:v|
tmpString:=str copyReplaceAll:k和:v。
新闻字符串:=tmpString
].
^新闻字符串
!
不幸的是,它似乎只替换
标记
字典的最后一项。我做错了什么?我可能还应该指出,我对Smalltalk几乎没有经验


选择的解释器是‘syx’。

我想你想做一些类似的东西

newString := str
然后在
键和值do:
块中:

tmpString := newString copyReplaceAll: k with: v.
因为现在您正在为每个键/值对生成一个
tmpString
,并且只替换了一个键。然后将其分配给
新闻字符串
。为了实现您的目标,您应该将
copyReplaceAll:
发送到上一次迭代中处理的字符串。这可以通过向
newString
发送消息来完成,但对于第一次迭代,您应该为其分配
str
的值

p.S. 我还认为这个更干净的版本应该可以:

escapeHtml: str
    |tags newString|
    newString := str copy.
    ...
    tags keysAndValuesDo: [ :k :v | newString replaceAll: k with: v ].
    ^newString

我很尴尬,我没能早点意识到我在复制同样的字符串。非常感谢。它现在确实起作用了。:-)@我还在答案中添加了关于算法的建议,也许你会喜欢;)我很感激,但不幸的是,syx似乎没有就地replaceAll的定义(
#String:replaceAll:with:
),因此我不得不坚持使用旧代码(但是,我去掉了多余的
tmpString
变量)。我再次表示感谢,但syx只是缺少适当的方法。