新手问题 问个正则表达式的更优美写法

cre16yu · 2020年08月21日 · 最后由 yhk17 回复于 2020年09月10日 · 1729 次阅读
text = '[quote][pid=446682464,23044506,4]Reply[/pid] [b]Post by [uid=43110557]掌露成霜[/uid] (2020-08-21 07:54):[/b]<br/><br/>被不被欺负无非是自己选择而已。我小学毕业的时候1米25,扳手腕扳不过全班女生,本来是挺容易被欺负的,然而整个中学生涯都没被人欺负过。<br/>说白了就是审时度势而已,知道没啥武力,平时就温和一些,拿自己掌握的资源最大限度的给自己谋福利。<br/>我曾经拿半套篮球飞人挑班里差生圈中比较面善的混了个脸熟。[/quote]<br/><br/>你真是个人才。'
text.gsub!('<br/>', "\n")
text.gsub!(/\[quote\].*?\[uid.*?\](.*?)\[\/uid\].*?\[\/b\](.*?)\[\/quote\](.*?)/m){|a|
  r = /\[quote\].*?\[uid.*?\](.*?)\[\/uid\].*?\[\/b\](.*?)\[\/quote\](.*?)/m.match(a)
  mid = r[2].gsub("\n", "\n>")
  ">#{r[1]} 说:\n>#{mid}\n#{r[3]}"
}

puts text

把网页文本保存成 markdown,觉得图中写法比较不好,但是用下面这个写法又没有达到把 [quote] 正文每行前加个'>'号的效果。有更优美的写法吗?

text.gsub!(/\[quote\].*?\[uid.*?\](.*?)\[\/uid\].*?\[\/b\](.*?)\[\/quote\](.*?)/m, ">\\1 说:\n>#{"\\2".gsub("\n", "\n>")}\n\\3")
# 不能成功替换

这是 BBCode

可以找相关的 gem 比如 https://github.com/veger/ruby-bbcode 把 bbcode 翻译成 HTML 然后做进一步处理

text.gsub!(/\[quote\].*?\[uid.*?\](.*?)\[\/uid\].*?\[\/b\](.*?)\[\/quote\]/m){
  author = $1
  mid = $2.gsub("\n", "\n>")
  ">#{author} 说:\n>#{mid}\n"
}

https://stackoverflow.com/a/1732454/2214973

SO 神贴:不要用正则去解析 html!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号