Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 最终用户可编辑文本替换占位符的简单解决方案是什么?_Javascript_Ruby_Regex_Replace - Fatal编程技术网

Javascript 最终用户可编辑文本替换占位符的简单解决方案是什么?

Javascript 最终用户可编辑文本替换占位符的简单解决方案是什么?,javascript,ruby,regex,replace,Javascript,Ruby,Regex,Replace,下面是我试图解决的问题:用户可以在网站上显示某个内容的自定义4字符标题,例如新闻。我想添加对一种方式的支持,用户也可以从中指定图标 我正在考虑使用括号,例如,用户将编写[camera]pic,并将其转换为pic,以正确的字体图标显示。但是,我也希望能够避开标记,这样(例如,f[[x]将被打印为f[x],而不是f[。文本占位符将永远不会嵌套,但它们可能是相邻的(例如,[star][star][star][star star]).我努力用正则表达式解决这个问题*,并得出结论,正则表达式可能不是解决这

下面是我试图解决的问题:用户可以在网站上显示某个内容的自定义4字符标题,例如
新闻
。我想添加对一种方式的支持,用户也可以从中指定图标

我正在考虑使用括号,例如,用户将编写
[camera]pic
,并将其转换为
pic
,以正确的字体图标显示。但是,我也希望能够避开标记,这样(例如,
f[[x]
将被打印为
f[x]
,而不是
f[
。文本占位符将永远不会嵌套,但它们可能是相邻的(例如,
[star][star][star][star star]
).我努力用正则表达式解决这个问题*,并得出结论,正则表达式可能不是解决这个问题的合适方法

对于这类问题,有没有一种简单的解决方案可以用Javascript和Ruby干净地实现?或者,有没有另一种简单的方法来表示这些类型的文本占位符,以满足我的顺序和可转义的要求(例如,
${camera}pic
)或者我必须手工解析它,一次一个字符


*至于我尝试过的正则表达式:
\[(\w+)\]
很简单,但是当它不应该在
f[[x]
上时匹配(\A.[^\[])\[(\w+)\]
是通过
f[[x]
但在
[x][y][z]
中的其他占位符都失败

以下是我的测试用例。假设将占位符替换为前缀为
$
的占位符文本,那么:

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
它使
[foo][bar][baz]
案例失败。

Ruby解决方案 您可以使用look behind防止
[[word]
中的子字符串
[word]
匹配:

(?<!\[)\[(\w+)\]

这很难看。我不确定是否有更优雅的方式。

为了演示,这里有一个更优雅的JS解决方案,它使用:

var output=str.replace(/\[(\w+)\]/g,函数(匹配,图标,偏移){
if(offset>0&&str.charAt(offset-1)='[')//如果以前存在并且[
return match.slice(1);//返回匹配但不打开[
//否则
返回“”;//或您想执行的任何操作
});
Javascript解决方案:

var str = 'abcd [foo][bar][baz] [[x] <[[x]> <[x]>';

str = str.replace( /(\[)?\[(\w+)\]/g, function ( match, escaped, icon ) {
    return escaped ? '[' + icon + ']' : '$' + icon;
});

// "abcd $foo$bar$baz [x] <[x]> <$x>"
var str='abcd[foo][bar][baz][[x]';
str=str.replace(/(\[)?\[(\w+)\]/g,函数(匹配,转义,图标){
返回转义?'['+icon+']':'$'+icon;
});
//“abcd$foo$bar$baz[x]”

你试过向后看吗?你能发布所有案例(特别是转义)的示例文本吗?@nhahdh:刚刚添加了我的测试案例。还没有试过向后看,但我明天可以研究。投票通过,但这在Javascript中不起作用,因为JS不支持向后看:(我正在寻找解决办法。+1.当涉及到
[[[x]
时,这一步解决方案将与两步解决方案略有不同,尽管我不确定OP在这种情况下真正想要什么。与Bergi的解决方案类似,当涉及到
[[x]时,它与两步解决方案略有不同
,但我不确定OP到底想要什么
var str = 'abcd [foo][bar][baz] [[x] <[[x]> <[x]>';

str = str.replace( /(\[)?\[(\w+)\]/g, function ( match, escaped, icon ) {
    return escaped ? '[' + icon + ']' : '$' + icon;
});

// "abcd $foo$bar$baz [x] <[x]> <$x>"