我正在开发一个简单的文本屏幕/终端模拟器(类似于JQuery终端插件,但没有RPC的东西和窗口功能).屏幕的每一行都是一个表格行(HTML字符串),并且打印命令可以插入带有一些属性(例如前景色和背景色)的文本.每个打印的文本都包含带有样式属性的跨度,例如:
<span style="color:#000000;background-color:#111111">A</span><span style="color:#222222;background-color:#333333>BC</span>
Run Code Online (Sandbox Code Playgroud)
这很好用.现在我想添加一个函数,它给出了给定屏幕位置的字符的所有属性,在上面的行中,位置0(A)的字符具有颜色#000000.所以我必须计算不属于span标签的字符,并获得最后的样式.我的第一个容易出错的解决方案是:
function getAttr(line, position) {
var result = {foreground:'', background:''},
ch = '', i, j = -1, tag = false;
// Count characters
for (i = 0; i < line.length && j < position; i++) {
ch = line.charAt(i);
if (ch == '<') {
tag = true;
}
if (ch == '>') {
tag = false;
}
else if (!tag) {
j++;
}
}
i--;
// Find styles
while (i > 0 && line.charAt(i) != '<') …Run Code Online (Sandbox Code Playgroud) 在这个字符串中
ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<
Run Code Online (Sandbox Code Playgroud)
我想,以取代之间的每个子XY以及<由一个或两个取决于以前的括号字符:
如果XY在(CN)将子字符串替换为之后ONE
如果XY在(CI)将子字符串替换为之后TWO
因此结果应为:
ab<(CN)cdONE<(CI)efgTWO<(CN)zONE<(CI)efgTWO<
Run Code Online (Sandbox Code Playgroud)
XY并且后面的字符应该被替换,而不是尖括号<。
这是用于修改HTML和任意字符之间可以发生XY和<。我想我需要两个正则表达式用于(CN)和(CI)。
# This one replaces just all XY:
my $s = 'ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<';
$s =~ s/(XY(.*?))</ONE/g;
# But how to add the conditions to the regex?
Run Code Online (Sandbox Code Playgroud)