2012-12-29 27 views
2

我拼命地試圖在Smalltalk中編寫一個非常基本的方法來轉義HTML標籤('<'和'>')。在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 
! 

不幸的是,它似乎只更換tags字典的最後一個項目。我究竟做錯了什麼?我也許應該指出,我對Smalltalk的經驗很少。

選擇的解釋器是'syx'。

回答

3

我認爲你要拍類似

newString := str 

,然後在keysAndValuesDo:塊:

tmpString := newString copyReplaceAll: k with: v. 

,因爲現在你正在生成的每個鍵/值對tmpString只有一個關鍵替換。比你將它分配到newString。爲了達到你的目標,你應該發送copyReplaceAll:到之前迭代處理的字符串。這可以通過向newString發送消息來完成,但對於第一次迭代工作,您應該爲其分配值str

附: 我也認爲這更清楚地版本應該工作:

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

我不好意思我不知道遲早我是複製相同的字符串所有的地方。謝謝!它確實現在工作。 :-) –

+0

@المستخدمغيرموجود我也加了一個關於算法的建議給答案,也許你會喜歡它的) – Uko

+0

我很感激,但不幸的是syx似乎沒有一個就地replaceAll的定義('#String:replaceAll:with:'),所以我必須堅持舊代碼(但是,我擺脫了superfluent'tmpString'變量)。再一次,我很欣賞它,但syx只是缺乏適當的方法。 –