Learning site for website creation

最終更新日から1年以上経過しています

履歴の残る検索置換

  • 投稿日:2014年04月04日
  • 更新日:2014年04月05日

データの整理をしていたら昔のソースコードがでてきた。
しかもDOMの操作でjQuery使わなかったから面倒だった気がする。

サンプルデータ

履歴の残る検索置換

HTML

<h1>履歴の残る検索置換</h1>
<div id="searchBox">
<div style="border:1px solid #DDD;">
<textarea id="str" name="str" rows="4" cols="80">ここに検索置換する文章を入力してください</textarea>
<p>
    検索する文字 <input type="text" name="search" value="" /><br />
置換する文字 <input type="text" name="replace" value="" />
</p>
</div>
<div id="resultbox"></div>
<p>
    <input type="button" value="置換する" onclick="check()" />
    <input type="button" value="戻る" onclick="back()" />
    <input type="button" value="リセット" onclick="reset()" />
</p>
</div>

JavaScript

var tmp = []; //置換で得た文字列を保存する配列
function check() {
    var textareaStr = '';
    if (document.getElementById("resultbox").childNodes.length === 0) {
        //最初だけtextareaから文字列を取得
        var strElm = document.getElementById('str');
        textareaStr = strElm.value;
        //textareaを入力不可に
        strElm.readOnly = true;
    } else {
        //2回目以降は置換で得た文字列を取得
        textareaStr = tmp[tmp.length-1];
    }
    //最後の検索用文字列取得
    var searchElms = document.getElementsByName("search");
    var searchElm = searchElms.item(searchElms.length - 1);
    var search = searchElm.value;
    //検索用文字列を入力不可に
    searchElm.readOnly = true;

    //最後の置換用文字列取得
    var replaceElms = document.getElementsByName("replace");
    var replaceElm = replaceElms.item(replaceElms.length - 1);
    var replace = replaceElm.value;
    //置換用文字列を入力不可に
    replaceElm.readOnly = true;

    //検索用文字列と置換用文字列が空文字じゃなければ処理を行う
    if (search !== '' && replace !== '') {
        //次回使用する置換済み文字列を追加
        tmp.push(replaceAll(textareaStr, search, replace));
        //表示用のspan付き置換文字列を代入
        textareaStr = replaceAllSpan(nl2br(h(textareaStr)), nl2br(h(search)), nl2br(h(replace)));
        //次回使用する入力パーツを表示用変数に追記
        textareaStr += '<p>検索する文字 <input type="text" name="search" value="" /><br />  ';
        textareaStr += '置換する文字 <input type="text" name="replace" value="" /></p>';

        //今回の検索置換結果を表示するdiv要素を生成
        var divElm = document.createElement('div');
        //生成したdiv要素に表示用文字列を代入
        divElm.innerHTML = textareaStr;
        //生成したdiv要素に枠線をつける
        divElm.style.border = '1px solid #DDD';

        //上記で生成したdiv要素を<div id="resultbox">の最後に追加
        var resultboxElm = document.getElementById("resultbox");
        resultboxElm.appendChild(divElm);
    }
}
//履歴全消去関数
function reset() {
    //検索結果を削除
    document.getElementById("resultbox").innerHTML = '';
    //検索対象文字列を入力可能に
    var strElm = document.getElementById('str');
    strElm.readOnly = false;
    //検索・置換文字列を入力可能に
    var searchElms = document.getElementsByName("search");
    var searchElm = searchElms.item(searchElms.length - 1);
    searchElm.readOnly = false;
    var replaceElms = document.getElementsByName("replace");
    var replaceElm = replaceElms.item(replaceElms.length - 1);
    replaceElm.readOnly = false;
    //検索対象文字列管理配列リセット
    tmp = [];
}

function back() {
    //最後の結果を削除
    var resultboxElm = document.getElementById("resultbox");
    resultboxElm.removeChild(resultboxElm.lastChild);
    //最後に追加した検索対象文字列を削除
    tmp.pop();
    //検索対象文字列がなくなったら最初のtextareaを入力可能に
    if (tmp.length === 0) {
        var strElm = document.getElementById('str');
        strElm.readOnly = false;
    }
    //検索・置換文字列を入力可能に
    var searchElms = document.getElementsByName("search");
    var searchElm = searchElms.item(searchElms.length - 1);
    searchElm.readOnly = false;
    var replaceElms = document.getElementsByName("replace");
    var replaceElm = replaceElms.item(replaceElms.length - 1);
    replaceElm.readOnly = false;
}

//HTMLで意味のある記号をエスケープ
function h(str) {
    str = str.replace(/&/g, "&amp;");
    str = str.replace(/"/g, "&quot;");
    str = str.replace(/'/g, "&#039;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");
    return str;
}
//改行コードを<br />タグに変換する
function nl2br(str) {
    str = str.replace(/\r\n/g, "<br />");
    str = str.replace(/(\n|\r)/g, "<br />");
    return str;
}
//表示用span付置換関数(検索置換した文字列にspanタグをつけて背景を黄色にする)
function replaceAllSpan(org, search, replace) {
    return org.split(search).join('<span style="background-color:#FF0;">' + replace + '</span>');
}
//通常置換関数
function replaceAll(org, search, replace) {
    return org.split(search).join(replace);
}

window.onload = function () {
    //textareaの初期値の取り扱い
    var elm = document.getElementById('str');
    elm.onfocus = function () {
        if (elm.value == elm.defaultValue) {
            elm.value = '';
            elm.style.color = '#000';
        }
    };
    elm.onblur = function () {
        if (elm.value === '') {
            elm.value = this.defaultValue;
            elm.style.color = '#CCC';
        }
    };
};

CSS

/*textareaの初期値グレーに*/
#str {
    color: #CCC;
}
/*textareaを枠内に納まるように*/
textarea {
    width: 100%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -o-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
}