一開始寫 ASP 程式的時候, 老闆要我寫一支可以清除 HTML code 的程式...
那時候很笨...技巧也很差...所以就寫出了一個像是這樣的 "東西"...
第一代
for i = 1 to len(str)
if right(left(str, i), 1) <> "<" then
if j = 1 then
if right(left(str, i), 1) = ">" then
j = 0
end if
else
str = str & right(left(str, i), 1)
end if
else
j = 1
end if
next
看了這段程式, 就可以知道有多笨了吧。最可怕的地方是這個的迴圈執行次數是隨字串的長度來增加的。以一篇 500 字的文章來說好了。加上 HTML code 後, 長度變成 1000 很正常。有些用戶還直接貼 word 檔。可能變成 2000 個字元。而列表頁的需求是一頁顯示 10 筆資料。所以平均每頁要跑 10000 ~ 20000 左右的迴圈。網頁的效率有多差, 可想而知。想像一個頁面要開 1~2 分鐘, 有多少人會等...
終於, 連我自己都看不下去了。所以大約半年後, 新學了一個 instr 就現學現用, 寫出了比較像樣的程式。
第二代
a = 1
b = 2
while a <> b
a = InStr(1, str, "<")
if a <> 0 then
b = InStr(a, str, ">")
if b <> 0 then
str = left(str, a - 1) & right(str, len(str) - b)
else
str = left(str, a - 1)
end if
else
b = a
end if
wend
第二代的效率就好很多了, 一樣是用迴圈做, 不過迴圈執行的次數取決在 HTML tag 的數量。一樣以 500 字的文章來說, 就算從 word 貼過來, 也不會超 100 個 tag 吧, 一頁 10 筆迴圈執行次數只要 200~800 次就完成了。整體執行效率提升了至少 15 倍。一個網頁開 60 秒跟開 4 秒的差別。成績算是很不錯了吧。後來又過了一年吧, 發現其實還有更好的方法。於是寫出了...
第三代
Function ReplaceRegExp(strString, strPattern, strReplace)
Dim RE: Set RE = New RegExp
With RE
.Pattern = strPattern
.IgnoreCase = True
.Global = True
ReplaceRegExp = .Replace(strString, strReplace)
End With
End Function
str = ReplaceRegExp(str, "<[^>]*>", "")
第三代有二個重點:
1. 重覆使用: 寫成 function 了, 可重覆使用
2. 效率更高
有人說寫程式是一種藝術, 我覺得這樣說有點 "太超過"。不過, 肯定是一門需要不斷學習鑽研的專業技術。這篇看起來應該可以算是一個程式設計的笑話吧。希望有一天我可以變成正面的教材...哈。
訂閱:
張貼意見 (Atom)
















0 意見:
張貼意見