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
-branch が選択されます。
さらに文字を追加したい場合は、それらを の中に入れ[ ]
、if ステートメントを追加してそれらを処理します。を除く任意の文字をエスケープせずに-
使用できます。これらの文字を追加するには、それらの前に別の文字を配置する必要があります。\
]
\