検索で文字を区別させないようにするには…



0   名前: れい : 2005/05/25 20:51
始めまして。色々調べてみたのですが、どうしても分からないので質問を
させて頂きます。

下記のような検索スクリプトで、大文字・小文字・半角・全角を区別させない
ようにしたいのですが、どのようにしたら良いのでしょうか…。
別のファイルからデータを絞り込んで検索してくるというものです。
宜しくお願いします。

var sortCond;

function sortData1(sortCond) {
testdata.Sort = sortCond;
testdata.Reset();
}
function sortData2() {
var cond1 = f1.s1.options[f1.s1.selectedIndex].value;
var cond2 = f1.s2.options[f1.s2.selectedIndex].value;
sortCond = cond1 + ";" + cond2;
testdata.Sort = sortCond;
testdata.Reset();


}
function filData(fldName,mark,intNum) {
testdata.filter= fldName + mark + f1.int[intNum].value;
testdata.Reset();
for (var i=0; i<f1.int.length; i++) {
if (i != intNum) {
f1.int[i].value='';
}
}
}
function filDataJoin(filStr) {
filCond = "";
if (filStr != "")
{
strWord = filStr.split(" ");
var filWord = new Array();

for (var i=0; i<strWord.length; i++) {
filWord[i] = "a=*" + strWord[i] + "*|";

filWord[i] += "b=*" + strWord[i] + "*|";

filWord[i] += "c=*" + strWord[i] + "*|";

filWord[i] += "d=*" + strWord[i] + "*|";

filWord[i] += "e=*" + strWord[i] + "*";

if (i == 0) {
filCond = "(" + filWord[i] + ")";
} else {
filCond += "&" + "(" + filWord[i] + ")" ;
}
}
}
testdata.filter= filCond;
testdata.Reset();
}
function resetAll() {
f1.s1.selectedIndex=0;
f1.s2.selectedIndex=0;
f1.s3.selectedIndex=0;
f1.s4.selectedIndex=0;
f1.s5.selectedIndex=0;
f1.inpt.value='';
testdata.Sort='';
testdata.filter='';
testdata.Reset();
}

1   名前: Pid : 2005/05/25 20:51
どもです。

えーと,提示して頂いたスクリプトには未定義のオブジェクトやプロパティが散見されますので,スクリプトを「過不足なく」提示して下さい。おそらく HTMLFormElement を使っておられるのでしょうから,実際のフォーム構造も合わせてお願いします(こちらが実際に動作確認できるくらいだと助かります)。

また,これがどういう場面で用いられるのか(見た感じ IE 専用でしょうか),検索の書式はどういうものかも,差し支えない範囲で教えて下さい。全体像が分からないまま,何から何まで解析するのは疲れるので…(^^;)。

それはさておき,今回の

> 大文字・小文字・半角・全角を区別させないようにしたい

という件に関しては,正規表現をうまく使えば良いかと。

・string.match(/[A-ZA-Z]+/gi); // string 中の全角半角英数を大小文字の区別無しにマッチ

ただ,i オプションで全角英数を ignoreCase してくれるかは実装依存ですので,確実に行うには

・string.match(/[A-Za-zA-Za-z]+/g);

あるいは,JavaScript の内部文字コードは Unicode で統一されていますので

・string.match(/[\u0041-\u005a\u0061-\u007a\uff21-\uff3a\uff41-\uff5a]+/g);

2   名前: れい : 2005/05/25 20:51
Pidさん、丁寧なご返答有難うございます!
それとスクリプトを全て書いておらずにすみませんでした…;
長いので分けて書かせて頂きます。

<script type="text/javascript">
<!--
var sortCond;
function sortData1(sortCond) {
testdata.Sort = sortCond;
testdata.Reset();
}
function sortData2() {
var cond1 = f1.s1.options[f1.s1.selectedIndex].value;
var cond2 = f1.s2.options[f1.s2.selectedIndex].value;
sortCond = cond1 + ";" + cond2;
testdata.Sort = sortCond;
testdata.Reset();

}
function filData(fldName,mark,intNum) {
testdata.filter= fldName + mark + f1.int[intNum].value;
testdata.Reset();
for (var i=0; i<f1.int.length; i++) {
if (i != intNum) {
f1.int[i].value='';
}
}
}
function filDataJoin(filStr) {
filCond = "";
if (filStr != "")
{
strWord = filStr.split(" ");
var filWord = new Array();

for (var i=0; i<strWord.length; i++) {
filWord[i] = "a=*" + strWord[i] + "*|";
filWord[i] += "b=*" + strWord[i] + "*|";
filWord[i] += "c=*" + strWord[i] + "*|";
  filWord[i] += "d=*" + strWord[i] + "*|";
filWord[i] += "e=*" + strWord[i] + "*";
if (i == 0) {
filCond = "(" + filWord[i] + ")";
} else {
filCond += "&" + "(" + filWord[i] + ")" ;
}
}
}
testdata.filter= filCond;
testdata.Reset();
}
function resetAll() {
f1.s1.selectedIndex=0;
f1.s2.selectedIndex=0;
f1.s3.selectedIndex=0;
f1.s4.selectedIndex=0;
f1.s5.selectedIndex=0;
f1.inpt.value='';
testdata.Sort='';
testdata.filter='';
testdata.Reset();
}
//-->
</script>

3   名前: れい : 2005/05/25 20:51
<object id="testdata" classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">
<param name="DataURL" value="test01.txt">
<param name="UseHeader" value="true">
</object>

4   名前: れい : 2005/05/25 20:51
<form id="f1">
<table id="datatbl" datasrc="#testdata" datapagesize="34" border=1>
<thead>
<tr>
<td colspan=6>
<input id=inpt type=text size=20>
<button onclick="filDataJoin(f1.inpt.value)">検索</button>
<span style="font-size:12px">※半角スペースで絞込み検索 </span>
<button onclick="resetAll()">リセット</button>
</td>
</tr>
<tr style="background-color:navy; color:white; font-size:12px">
<td>分類<br>
<select id=s1 onchange="sortData1(this.options[this.selectedIndex].value)">
<option value="+a" selected>昇順</option>
<option value="-a">降順</option>
</select></td>
<td>名称<br>
<select id=s2 onchange="sortData1(this.options[this.selectedIndex].value)">
<option value="+b" selected>昇順</option>
<option value="-b">降順</option>
</select></td>

5   名前: れい : 2005/05/25 20:51
<td>公開日<br>
<select id=s3 onchange="sortData1(this.options[this.selectedIndex].value)">
<option value="+c" selected>昇順</option>
<option value="-c">降順</option>
</select></td>
<td>名前<br>
<select id=s4 onchange="sortData1(this.options[this.selectedIndex].value)">
<option value="+d" selected>昇順</option>
<option value="-d">降順</option>
</select></td>
<td>保存場所<br>
<select id=s5 onchange="sortData1(this.options[this.selectedIndex].value)">
<option value="+e" selected>昇順</option>
<option value="-e">降順</option>
</select></td>
</tr>
</thead>
<tbody>
<tr>
<td><span datafld="a"></span></td>
<td width=157><span datafld="b"></span></td>
<td width=76><span datafld="c"></span></td>
<td width=128><span datafld="d"></span></td>
<td width=351><span datafld="e"></span></td>
</tr>
</tbody>
</table>
</form>

6   名前: れい : 2005/05/25 20:51  [URL
本当に長く…;
test01.txtと言うファイルからデータを持ってきて検索しています。
下記がその内容です。

a,b,c:data,d,e
画像,テスト資料1,20050124,田中,1-A,
テキスト,テスト資料1,20050322,加藤,1-A,
素材,テスト資料2,20050311,田中,1-B,
画像,テスト資料1,20050125,山田,1-A,
テキスト,テスト資料2,20041203,加藤,1-B,
素材,テスト資料3,20040628,高橋,1-B,

見辛いかと思いましたので、ファイルをサーバーに上げました。
現在IEのみで動作確認をしています。

それから、正規表現を調べて試してみたのですが上手く動作しませんでした。
自分の理解不足のためだと思います;
このスクリプトに対して、どのように記述したら良いのでしょうか…。
度々すみません。宜しくお願いします。

7   名前: Pid : 2005/05/25 20:51
リンクまで用意して下さり感謝です。TDC(Tabular Data Control)だったんですね…(^^;)。

まず,TDC の検索式では全角・半角はおろか大文字・小文字の違いも一括指定できませんので,いちいち JScript で生成してやらねばなりません。たとえば,「B」を全半大小区別なしで探そうとした場合,TDC の検索式では

・a=*b* | a=*B* | a=*B* | a=*b*

の四通りを各フィールド(a,b,c,d,e)ごとに用意しなければなりません(つまり,4x5=20 通り)。

まず,全角←→半角への相互変換を考えてみましょう。

・0(\u0030)… 0(\uff10)
・A(\u0041)… A(\uff21)
・a(\u0061)… a(\uff41)

ですので,半角の文字コードに 0xfee0(十進法だと 65248)を足してやれば全角になることが分かります。したがって,以下のようにしてみます。

(1). filDataJoin() 内の検索式生成部分( filWord[i] = "a=*" + strWord[i] + "*|"; 以下)を次のように書き換える。

filWord[i] = createExpression('a', strWord[i]) + '|';
filWord[i] += createExpression('b', strWord[i]) + '|';
filWord[i] += createExpression('c', strWord[i]) + '|';
filWord[i] += createExpression('d', strWord[i]) + '|';
filWord[i] += createExpression('e', strWord[i]);

……続く……

8   名前: Pid : 2005/05/25 20:51
……続き……

(2). 以下の関数を用意する。

function createExpression(field, value) {
var Zenkaku = /[0-9A-Za-z]/g;
var Hankaku = /[0-9A-Za-z]/g;

var toZenkaku = function(s) { return String.fromCharCode(s.charCodeAt() + 0xfee0); }
var toHankaku = function(s) { return String.fromCharCode(s.charCodeAt() - 0xfee0); }

var expression = field + '=*' + value + '*';

if (value.match(Zenkaku))
expression += value.replace(Zenkaku, function($0) { return '|' + field + '=*' + toHankaku($0) + '*'; } );
else if (value.match(Hankaku))
expression += value.replace(Hankaku, function($0) { return '|' + field + '=*' + toZenkaku($0) + '*'; } );

return expression;
}

これで,検索式で全角・半角を区別しないようなります。

大文字・小文字に関しても同様にして検索式を追加していきます。この場合は toLowerCase() を使えば簡単にできますので,頑張って下さい(すみません,手抜きで…(^^;))。

【TDC に関する詳細】
http://msdn.microsoft.com/workshop/database/tdc/tabular_data_control_node_entry.asp

【J(ava)Script のリファレンス】
http://www.axis.t.u-tokyo.ac.jp/%7Eshunak/ecmascript/
http://www.interq.or.jp/student/exeal/dss/ref/jscript/top.html

※ぶっちゃけ,データ自体の全角・半角をどちらかに統一した方が遥かに楽だと思います (^^;)。

9   名前: Pid : 2005/05/25 20:51
訂正 m(_ _)m。

> TDC の検索式では……大文字・小文字の違いも一括指定できません

TDC オブジェクトには CaseSensitive プロパティがありますね。デフォルトで大文字・小文字を区別しないようにするには

・<param name="CaseSensitive" value="false">

を入れておけば良いでしょう。全角・半角も,もうちっとうまいやり方がありそうな気がしますね。ご存知の方は教えて下さい。

10   名前: れい : 2005/05/25 20:51
Pidさんに教えて頂いたように記述した所、出来ました!
丁寧な解説まで書いて下さって有難うございます。

大文字・小文字はCaseSensitiveで出来たのですね…。
勉強不足ですみませんでした;

本当に有難うございました!

一覧へ戻る