我正在尝试制作一个简单的降价转换器,以便在JS和Regex上做得更好。
我现在需要找到两个星号之间的所有内容,并将它们包装在<i>
标签中:
var html = '*abc is a string*';
var html = html.replace(/\*/g , '<i>');
console.log(html);
结果:
<i>abc is a string<i>
我也看到了相关问题的答案,但我不确定如何相应地调整我的代码,或者它实际上做了什么:
(?s)<h1>.+</h1>
任何帮助都会很棒。
答案 0 :(得分:1)
您可以使用capture group来获取应包含在HTML标记中的内容:
var html = html.replace(/\*([^*]+)\*/g , '<i>$1</i>');
([^*]+)
的解释:
( # start of capture group
[^ # start of negated character class (match any character not listed)
* # literal asterisk character
] # end of negated character class
+ # match at least one of the previous token
) # end of capture group
所以[^*]+
表示“匹配至少一个不是*
的字符”。这样可以使到下一个*
的所有字符都匹配。
答案 1 :(得分:0)
您可以使用正则表达式[^*]+
。
'*abc is a string*'.match(/[^*]+/gi); //["abc is a string"]
答案 2 :(得分:0)
示例:
'*abc is a string*'.replace(/\*([\w\s]+)\*/g, '<i>$1</i>')
> '<i>abc is a string</i>'
答案 3 :(得分:0)
或者在你的正则表达式中使用调整后的贪婪(下面我的模式中为+?
),尽管效率较低(参见http://blog.stevenlevithan.com/archives/greedy-lazy-performance)。接下来尝试使用回调:
var result = source.replace( /(*|_)(.+?)(\1)/g, function( all, starter, content, ender ) {
return "<i>" + content + "</i>";
} );
使用回调可能会提高代码的灵活性:
var result = source.replace( /(*|_)(.+?)(\1)/g, function( all, starter, content, ender ) {
switch ( starter ) {
case '*' :
return "<strong>" + content + "</strong>";
case '_' :
return "<em>" + content + "</em>";
}
} );