JSFiddle - React, Tailwind, and code Playground

HTML

<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="http://www.bliayad.org/articles/articles.htm">文章來源:http://www.bliayad.org/articles/articles.htm</a><br>
僅供學術使用<br>
#----div1開始
<div id="div1">
  <input id="search_str" type="text">
  <input type="button" value="搜尋" onclick="goSearch(document.getElementById('div1'),document.getElementById('search_str').value)">
<h1>何苦要第一名</h1>
<h2>來源:網路流傳</h2>
<p>老同學交了新女友,卻經常有空。<br>

000<br>

false<br>

null<br>

疊疊重複重複重複重複疊疊疊疊疊疊疊字疊字重複疊疊<br>

聽老同學說,他倆感情很要好,彼此心屬,極有婚嫁的契機。<br>

<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/thOdWgS2B4s&amp;hl=zh_TW&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/thOdWgS2B4s&amp;hl=zh_TW&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480"...

JavaScript

function goSearch(target,search_str)
{
    reverse_str(target);

    if(search_str!='')
    search(target,search_str);
}

function reverse_str(target)
{
    var tag, textNode, preText, nextText;
    var bt=[];
    if(target.getElementsByClassName)
    bt=target.getElementsByClassName('boldTag4Search');
    else if(target.querySelectorAll)
    bt=target.querySelectorAll('b.boldTag4Search');
    else
    {
        var allTag=target.getElementsByTagName('b');
        for(var i in allTag)
        if(allTag[i].className=='boldTag4Search')
        bt.push(allTag[i]);
    }

    for(var i=bt.length-1;i>=0;i--)
    {
        tag=bt[i];
        preText=getNeighbor(tag.previousSibling);
        nextText=getNeighbor(tag.nextSibling);
        //還原時必須把前後的textNode合併
        textNode=document.createTextNode((preText + (tag.textContent ? tag.textContent : tag.innerText) + nextText));
        tag.parentNode.replaceChild(textNode, tag);
    }
}

function getNeighbor(tag)
{
    if(tag==null || tag.nodeName!='#text')
    return '';

    var ret=tag.nodeValue;
    tag.parentNode.removeChild(tag);
    return ret;
}

function search(target,search_str)
{
    var _tag,tag=target.firstChild;
    var re= new RegExp('('+search_str+')+','g');
    var matchs,splits,newNode;

    do
    {
        if(tag.hasChildNodes())
        search(tag,search_str);

        if(tag.nodeName=='#text' && (matchs=tag.nodeValue.match(re)))    //用regexp是為了可找出疊字或字串連續疊字
        {
            splits=tag.nodeValue.replace(re,search_str).split(search_str);    //把疊字取代成為單個搜尋字串,這樣可以把疊字放在同一個<b></b>內
            
            for(var i in splits)
            {
                if(splits[i]!='')
                tag.parentNode.insertBefore(document.createTextNode(splits[i]),tag);

                if(matchs[i]==null)    //若一個textNode中有n個搜尋字,則regexp會match出n個結果,split會拆出n+1個,所以這邊要檢查index
                continue;

                newNode=document.createElement('b');
                newNode.className='boldTag4Search';
             ...