JSFiddle - React, Tailwind, and code Playground
HTML
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="javascript:tester();">
<label for="query" title=" Alt+Q ">搜尋:<input id="query" size="25" accesskey="q" type="text"></label>
<input value="開始" type="submit" /> <span id="matches"></span><br/>
選項:
<label for="cases"><input id="cases" type="checkbox">區分大小寫</label>
<label for="regex"><input id="regex" type="checkbox">正規式</label>
</form>
<div id="div1">
<a href="http://www.bliayad.org/articles/articles.htm">文章來源:http://www.bliayad.org/articles/articles.htm</a><br>
僅供學術使用<br>
<h1>何苦<天才>要第一名</h1>
<h2>來源:網路流傳</h2>
<p>老同學交了新女友,卻經常有空。<br>
疊疊重複重複重複重複疊疊疊疊疊疊疊字疊字重複疊疊<br>
English test<br>
聽老同學說,他倆感情很要好,彼此心屬,極有婚嫁的契機。<br>
<!--
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/thOdWgS2B4s&hl=zh_TW&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/thOdWgS2B4s&hl=zh_TW&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
-->
於是,順理成章地認為,他們應該會膠膩在一起,水乳濃郁,哪曉得晚餐找他,週末找他,他總是可以。<br>
有一天,老同學找我吃飯,返家的路上,我小心翼翼,怕傷他自尊,很客氣又故做不經心地問了一句:「你怎麼都這麼有空啊?」<br>
原以為這個階段的情侶應該形影不離。<br>
我有些擔心,再問:「女朋友呢?不用陪嗎?」<br>
老同學態度自然,落落大方的回答:「她約人了啊。」<br>
幾乎每個星期都是如此。<br>
...
CSS
b { background-color: #fcc; padding: 0 .1em 0 .1em; }
JavaScript
/**
* Configs
*/
var RESULT_TAG = "b";
var RESULT_ATTR = "hlite";
/**
* Helpers
*/
function $(id){ return document.getElementById(id); }
/**
* Main
*/
// 將正規式的特殊字元還原為一般字元
String.prototype.escapeRegExp = function() {
return this.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
function unhighlight() {
var els = document.getElementsByTagName('*'), els2 = [];
for (var i=0,I=els.length;i<I;++i) {
if (els[i].getAttribute(RESULT_ATTR)) els2.push(els[i]);
}
for (var i=0,I=els2.length;i<I;++i) {
var el = els2[i];
var pre = el.previousSibling;
var post = el.nextSibling;
var content = el.firstChild.nodeValue;
if (pre && pre.nodeName=='#text') {
content = pre.nodeValue + content;
pre.parentNode.removeChild(pre);
}
if (post && post.nodeName=='#text') {
content = content + post.nodeValue;
post.parentNode.removeChild(post);
}
el.parentNode.replaceChild(document.createTextNode(content),el);
}
}
function highlight(obj, reg){
var d = document;
var o = [ obj || d.body ]; // 待處理陣列,由後往前,0-based
var h = d.createElement(RESULT_TAG); // 模板
h.setAttribute(RESULT_ATTR,'1');
var matched = 0; // 匹配數
var i = 0, el;
do {
el = o[i];
if (el.nodeName=='#text') {
highlight_text(el, reg);
}
else {
// 將子元素加到待處理陣列
var c = el.childNodes, j = c.length;
while(j) { o[i++] = c[--j]; }
}
} while (i--)
return matched;
function highlight_text(obj, reg) {
reg.lastIndex = 0;
var l = reg.exec(obj.nodeValue);
if( l !== null ) {
var k = l[0].length;
obj = obj.splitText( reg.lastIndex - k ); // Y = X.splitText(index) 會把 X 切成二個 node,執行後 X 為前面的,Y 為後面的
if( obj.nodeValue.length > k ) o[i++] = obj.splitText(k);
var t = h.cloneNode( true );
...