function highlight(text) {
var result = [];
for (var i = 0; i < text.length; i++) {
if (text[i] === '"') {
var stop = text.indexOf('"', i + 1);
result.push('<span class="a">');
result.push(text.substring(i, stop+1));
result.push('</span>');
i = stop;
}
else if (text[i] === '*') {
var stop = text.indexOf('*', i + 1);
result.push('<span class="b">');
result.push(text.substring(i, stop+1));
result.push('</span>');
i = stop;
}
else if (text[i] === '<') {
// Skip simple HTML tags.
var stop = text.indexOf('>', i + 1);
result.push(text.substring(i, stop+1));
i = stop;
}
else {
result.push(text.substring(i,i+1));
}
}
return result.join('');
}
例子:
>>> highlight('foo *bar"baz"qux* "foobar" qux')
"foo <span class="b">*bar"baz"qux*</span> <span class="a">"foobar"</span> qux"
或者使用正則表達式:
function highlight2(text) {
return text.replace(/([*"]).*?\1|<[^<>]*>/g, function (match, ch) {
// 'match' contains the whole match
// 'ch' contains the first capture-group
if (ch === '"') {
return '<span class="a">' + match + '</span>';
}
else if (ch === '*') {
return '<span class="b">' + match + '</span>';
}
else {
return match;
}
});
}
正則表達式([*"]).*?\1
包含以下內容:
[*"]
匹配*
或"
。 (他們不需要在[ ]
內轉義)。
()
捕獲匹配的字符串爲捕獲組1
.*?
匹配任何東西,直到第一...
\1
相同的字符串相匹配的被捕獲到捕獲組1
|
是「要麼」。它試圖匹配左側,如果失敗,它會嘗試匹配右側。
<[^<>]*>
符合簡單的html標籤。這不會是能夠處理與他們的文字<
或>
屬性:<a href="info.php?tag=<i>">
(即壞的HTML反正,但有些瀏覽器會接受它。)
在這種情況下,當一個HTML標籤相匹配時,ch
參數將爲undefined
,並且將挑選else
分支。
如果你想添加更多的字符,只需將它們放入[ ]
,並添加一個if語句來處理它們。您可以使用除-
,\
和]
之外的任何字符,而不會將其轉義。要添加這些字符,您需要在其前面放置另一個\
。
此失敗使用該試驗字符串: 亮點( '看<跨度類= \ 「一個\」> 「測試」')給出以下: 「請看 \「a> \」test「 –
它不應該被多次應用。如果您願意,我可以更新它,以便它會嘗試忽略HTML標籤。 –