这是我要解决的问题:用户可以为网站上的某些内容显示自定义的 4 字符标题,例如NEWS
. 我想添加对用户可以从Font Awesome指定图标的方式的支持。
我正在考虑使用方括号,例如,用户会写[camera]pic
,这将被翻译为<i class="icon-camera"></i>pic
使用正确的 Font Awesome 图标显示。但是,我也希望能够转义标记,以便 (eg)f[[x]
将打印为f[x]
,而不是f[<i class="icon-x"></i>
。文本占位符永远不会嵌套,但它们可能是相邻的(例如[star][star][star][star]
)。我努力使用正则表达式*解决这个问题,并得出结论,正则表达式可能不是解决问题的合适方法。
对于这类问题,有没有可以用 Javascript 和 Ruby 干净地实现的简单解决方案?或者,是否有另一种简单的方法来表示满足我的顺序和可逃避要求的这些类型的文本占位符(例如,${camera}pic
相反)?还是我必须手动解析它,一次一个字符?
* 至于我尝试过的正则表达式:\[(\w+)\]
很简单,但不应该在f[[x]
. (\A|[^\[])\[(\w+)\]
是通过f[[x]
,但对于[x][y][z]
.
这是我的测试用例。假设将占位符替换为以 a 为前缀的占位符文本的简单转换$
,则:
describe '#to_var' do
it { helper.to_var('abcd').should == 'abcd' }
it { helper.to_var('[foo][bar][baz]').should == '$foo$bar$baz' }
it { helper.to_var('[[x]').should == '[x]' }
it { helper.to_var('<[[x]>').should == '<[x]>' }
it { helper.to_var('<[x]>').should == '<$x>' }
end
我想出的最接近的正则表达式是:
icon_code_regex = %r(
(\A # beginning of string
| # or
[^\[]) # not a left bracket
\[ # literal left bracket
(\w+) # the good stuff
\] # literal right bracket
)x
str.gsub(icon_code_regex, '\1$\2').gsub('[[', '[')
这失败了[foo][bar][baz]
。