Rails 如何過濾你要的 HTML tag 內容
WriterShelf™ is a unique multiple pen name blogging and forum platform. Protect relationships and your privacy. Take your writing in new directions. ** Join WriterShelf**
WriterShelf™ is an open writing platform. The views, information and opinions in this article are those of the author.
Like
or Dislike
About the Author
很久以前就是個「寫程式的」,其實,什麼程式都不熟⋯⋯
就,這會一點點,那會一點點⋯⋯
More to explore
一些看是很簡單的要求,實務上,卻可能很不簡單!
我現在就碰到一個很簡單的要求,就是把一個 HTML 內容做一份字數限制的簡述「summary」,很直覺的就是很簡單嘛,就移除所有的 HTML tags,在抓前幾個字就好了,不過就是一行碼:
這麼簡單的一行碼就移除所有的 html tag,前後與連續的空白,再切掉超過的部分,很簡單啊,不過,馬上就遇到很多問題了,客戶說:表格不要、照片的說明不要、程式碼不要⋯⋯
那要怎麼做呢?我們就已以下這個 HTML fragment 來測試:
這個 html fragment 很簡單,就是 p 跟 table,我們要做的實驗也很簡單,就是只要 <p> 不要 <table>,很直覺得,我們就是用個 Rails 內建 helper:sanitize,在 Rails 的文件中,也說可以很簡單的選擇客製化的 whitelisted tags 選擇:
這個 sanitize 很清楚的要求要移出 table,只保留在tags 中指定的 html tags,輸出的結果還不錯:
那要是用網路上很多人推薦的 sanitize gem 呢?
rgrove/sanitize — Whitelist-based Ruby HTML and CSS sanitizer. Contribute to rgrove/sanitize development by creating an account on GitHub. Go to GitHub
它更簡單好用,只要指定你要留下來的 tags ⋯⋯
只可惜,它是把不要的 tag 去除掉了,但沒有去掉裡面的內容,這是他的輸出:
所以,sanitize gem 並不合我們的需求,rails內建的 sanitize 是我們要的,但是,對不同的情境,就要看不同的需求了,也許,sanitize gem 大合您意。
另一個做法可以用 nokogiri,它幾乎沒有限制,但是,有種殺雞用牛刀的感覺,而且,會有很多行的碼,我不是很喜歡。
有一個要注要的是,很多這類的程式碼都會被用在 helper 中,當用 rails c 去測試時,必須要
ApplicationController.helpers.my_method(parameter)
再加上 reload!,helper 只是一個住在記憶體中的 instant,還蠻討厭的。不過真要做一個能簡述「summary」其實絕不是以上所說的那麼簡單,真正要做到有意義的簡述,就必須要用到 AI 人工智慧,google 有一個開發案用 tensorflow 來做文章的簡述 tensorflow,也有很多 github 的開源在做這個,例如:sumy,Readability 等等,ruby 的世界在 AI 好像沒有那麼多案子,可以確定的是,這會是一個很有趣也很有未來的挑戰,以後,看能不能用 AI 來幫忙學生交讀書心得,哈哈哈哈哈!