繁体   English   中英

Ruby正则表达式将星号/下划线表示为强/ em?

[英]Ruby regular expression for asterisks/underscore to strong/em?

作为我正在编写的聊天应用程序的一部分,我需要使用正则表达式来匹配聊天消息中的星号和下划线,并将它们转换为<strong><em>标记。 由于我对正则表达式感到很糟糕,所以我真的被困在这里。 理想情况下,我们将其设置为:

  • 可以将一到三个字(但不能更多)标记为强/ em。
  • 诸如“难以置信”的模式将被匹配。
  • 一行中只有一个或另一个(强OR)。

上面的参数按重要性顺序排列,只有#1是完全必要的-其他参数仅是漂亮。 我最接近可行的方法是:

text = text.sub(/\*([(0-9a-zA-Z).*])\*/,'<b>\1<\/b>')
text = text.sub(/_([(0-9a-zA-Z).*])_/,'<i>\1<\/i>')

但这显然不适用于我们的任何参数。

奇怪的是,鉴于使用星号表示粗体和诸如此类的用法很普遍,目前还没有类似的例子。 如果存在,我将无法在插件/宝石之外找到它(该插件不适用于该实例,因为我实际上仅在模型中的一个地方需要它)。 任何帮助,将不胜感激。

这应该可以帮助您完成自己的工作:

sub(/\*(.*)\*/,'<b>\1</b>')
sub(/_(.*)_/,'<i>\1</i>')

首先,您的条件有点奇怪,但是,好吧...

看来,可能的算法是找到一条消息中的匹配项数量,对它们进行计数以查看是否少于4个,然后尝试执行一组替换。

strong_regexp = /\*([^\*]*)\*/
em_regexp = /_([^_]*)_/

def process(input)
  if input ~= strong_regexp && input.match(strong_regexp).size < 4
    input.sub strong_regexp, "<b>\1<\b>"
  elsif input ~= em_regexp && intput.match(em_regexp).size < 4
    input.sub em_regexp, "<i>\1<\i>"
  end
end

您的规格尚不完全清楚,但是如果您了解这一点,则可以自己进行调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM