我试图根据括号的级别以及它们是否匹配来突出显示括号。所以第一级获得以下类(class) paren_1
, 第二个得到 paren_2
等等。如果有的话,我也想突出显示插入符号旁边的一组括号。意思是如果你在括号(左或右)旁边有插入符号,它应该突出显示所述括号及其对应的括号。 fiddle 中显示了我对此的(损坏的)实现。
这很有效。问题如下
- 如果输入字符串中有 HTML,一切都会分开。在使用
jQuery('<div />').text(text).html()
发送之前,我尝试转义 html , 这有效,但破坏了插入符号的位置。 - 如果“同一层级”上有多个括号,并且插入符紧挨着一组,它会比应有的突出显示更多。
- 如果有不匹配的括号,应该用红色或类似的东西突出显示。这也不起作用,我不知道如何实现它。我已尽力而为,但一切都失败了。
JSFiddle:http://jsfiddle.net/yWzWV/1/
请注意:我对 javascript 或 jquery 都不是很好,所以如果这段代码让你的眼睛流血,你必须原谅我。
提前致谢!
最佳答案
问题解决了,但我又遇到了一个问题。这是修复的 fiddle :http://jsfiddle.net/Axvgf/
修改后的方法:
function colorize(text, pos) {
var i = 0, current_times = 0;
var startc = '(', endc = ')';
var current = -1;
var entities = {'>': '>','<':'<'};
var p2 = 0;
var regex = new RegExp(Object.keys(entities).join("|"),'g');
var converted = text.replace(regex, function(x, j) {
if(pos > j) p2 += entities[x].length - 1;
return entities[x];
});
pos += p2;
var parens = [], indices = [], o = {};
var newText = converted.replace(/((?:\\)*)([()])/g, function(full, escape, x, idx) {
var len = escape.split(/\\/g).length - 1;
if (len % 2 == 0) {
indices.push(idx);
if (x == startc) ++i;
o[idx] = { selected: false, type: x, depth: i, idx: idx, pair: -1, extra: escape };
if (idx == pos) o[idx].selected = true;
if (x == startc) parens.push(idx);
else {
if (parens.length > 0) {
var p = parens.pop();
o[idx].pair = p;
if (o[p].selected) o[idx].selected = true;
o[p].pair = idx;
if (o[idx].selected) o[p].selected = true;
}
--i
}
}
});
newtext = converted;
indices = indices.sort(function(x,y) { return Number(y) - Number(x); });
indices.forEach(function(i) {
newtext = newtext.substr(0,i) + o[i].extra +
"<span class='" + (o[i].pair == -1 ? "unmatched " : "paren_" + (o[i].depth % 5)) +
(o[i].selected ? " selected_paren": "") + "'>" + o[i].type + "</span>" +
newtext.substr(i + 1 + o[i].extra.length)
});
return newtext;
}
关于javascript - 突出显示输入框内的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14015202/