我有以下脚本,它允许我选择文本,然后通过将所选文本包装在span
标签中来直观地突出显示它。
这通常可以正常工作,但如果有一个突出显示标记与另一个突出显示标记仅相隔一个空格,则它将两个突出显示连接在一起。
Javascript
var HVleftPanelContent = $("#highlight-view .top .content");
HVoutputUl = $("#highlight-view .contentBottom ul");
$("p").on("copy", highlight);
function highlight() {
var text = window.getSelection().toString();
var selection = window.getSelection().getRangeAt(0);
var selectedText = selection.extractContents();
var textStr = selectedText.textContent;
if (textStr == "\n") {
clearSelection();
return false;
} else if (textStr[textStr.length - 1] == "\n") {
textStr = textStr.slice(0, -1);
var reg = new RegExp("\n", "g");
textStr = textStr.replace(reg, "\n<b data='
'></b>") + "\n";
} else if (textStr.indexOf("\n") >= 0) {
var reg = new RegExp("\n", "g");
textStr = textStr.replace(reg, "\n<b data='
'></b>");
}
var span = $("<span class='highlight'>" + textStr + "</span>");
selection.insertNode(span[0]);
if (selectedText.childNodes[1] != undefined) {
$(selectedText.childNodes[1]).remove();
}
var txt = HVleftPanelContent.html();
HVleftPanelContent.html(txt.replace(/<\/span>(?:\s)*<span class="highlight">/g, ''));
HVoutputUl.html("");
$("#highlight-view .top .content .highlight").each(function () {
$("#highlight-view .contentBottom ul").append("<li><span>" + $(this).html() + "</span></li>");
});
saveIt();
clearSelection();
}
回顾
如果 HTML 看起来像这样:
This is a short paragraph
我突出显示“是”,标记更改为:
This <span>is</span> a short paragraph
然后我突出显示“this”或“a”,标记错误地更改为:
This <span>isa</short> paragraph
而不是它应该如何改变:
This <span>is</span> <span>a</span> paragraph
潜在问题
我认为问题出在这一行:
HVleftPanelContent.html(txt.replace(/<\/span>(?:\s)*<span class="highlight">/g, ''));
Regex 语句<span>
将彼此相邻的标签连接起来,这样如果两个span
标签直接相邻,它就会变成 one span
,但 Regex 并没有将连接限制为仅当它们直接相邻时对彼此。
所以,基本上,如果它们直接相邻,我如何才能将正则表达式更改为仅加入跨度标签。