前提・実現したい事
あるサイトにJavaScriptを実装して、メールアドレスのドメイン("@"以降)を取得するプログラムを組んでいます。
そこで、対象のテキストからドメインを取得しようとしておりますが、上手く行かず困っております。
入力規則(複数のアドレスを入力する際)は、「, or ;」で区切るようにしています。
*対象テキストは、「複数行テキスト(Note)(リッチテキスト無し)」になります。
############################################################
【(例)取得元テキスト】
Ritchie_Blackmore@111,eric_clapton@111;jimmy-page@111;,;
marty.friedman@222,you@2
2
2;jeff beck@22
2
,
slash@333;;Dimebag-Darrell@444,jhfjd;gfs1350
,123@555;123@555;000@555,555nyoe--;
@666,;@777;
AKIRA_TAKASAKI@888,
,
,
SUGIZO@999;char@101010
;
Nuno-Bettencourt@docomo.ne.jp,Sam-
Totman@softbank.ne.jp;
syu
@ezweb
.ne
.jp
;kiko.loureiro@yahoo.co.jp;paul.gilbert@gmail.com
【実行結果】
@111,
@222,
@333,
@444,
@555,
@666,
@777,
@888,
@999,
@101010,
@docomo.ne.jp,
@softbank.ne.jp,
@ezweb.ne.jp,
@yahoo.co.jp,
@gmail.com
############################################################
発生している問題・Error Message
【実装出来た事】
・対象テキストから値取得
・"@"以降のドメイン取得し、配列格納
・不要スペース削除
*「不要スペース削除」は、取得元テキストに改行が入っていると、
値を取得した際に、**『スペース』**に置き換わってしまうので実装しました。
【実装出来ない事】
・"@"を含む、ドメインのみ配列格納
実際のソースコード
javascript
1 2/************************************************************/ 3// ボタンが押されたら実行 4/************************************************************/ 5function Huton_Ga_Hutton_Da() { 6 7 /************************************************************/ 8 // 変数宣言 9 /************************************************************/ 10 var sarch = "@"; // 検索対象文字 11 var id = "TextArea_xxxx_xxxx_xxxx_$TextField"; // 取得対象テキストID 12 var split = /,|;/; // 分割対象文字 13 14 /************************************************************/ 15 // 取得処理開始!!! 16 /************************************************************/ 17 18 /* 1. 対象テキストから、値を取得し分割 */ 19 var text = document.getElementById(id).value; // テキストボックスから、値を取得 20 var domain = text.split(split); // 取得した値を、分割し配列へ格納 21 22 /* 2. 格納した文字列の修整 */ 23 for (var i = 0; i < domain.length; i++) { // LOOP 24 domain[i] = domain[i].replace(/\s+/g, ""); // 不要スペース削除 25 26 /* 3. "@" ドメイン取得 */ 27 if (domain[i].indexOf(sarch) >= 0) { // 配列検索 : "@" 28 domain[i] = domain[i].substring(domain[i].indexOf(sarch)); // "@"以降取得 29 } 30 } 31 32 /* 4. 重複Check */ 33 var modifyDomain = domain.filter(function(x, z, self) { // 重複Check 34 return self.indexOf(x) === z; // 重複データ削除 35 }); 36 37 /************************************************************/ 38 // 出力! 39 /************************************************************/ 40 alert(modifyDomain.toString()); 41} 42
最後に、ちゃんと取得出来たか確認の為、アラートにて表示させております。
上記ソースコードだと、配列の中には「"@"以外の物」まで格納されている状態です。
"@"のみの処理を行いたい場合、出力の所を下記コードに書き換えれば、出来るとは思うのですが
コードを見ていて、不格好だな~・・・と思いまして。。。
javascript
1/************************************************************/ 2// "@"のみ、処理を行いたい! 3/************************************************************/ 4 for (var j = 0; j < modifyDomain.length; j++) { // "modifyDomain" の、配列数分ループ処理 5 if (modifyDomain[j].indexOf(search) >= 0) { // 要素に "@" を含む物だけ登録 6 alert(modifyDomain[j]); 7 8 // ~~ "@"(ドメイン)のみを使う、その後の処理 ~~ 9 } 10}
試した事
そこで、/* 3. "@" ドメイン取得 */ の所を、変更しました。
javascript
1/************************************************************/ 2// ボタンが押されたら実行 -- 修正したが、ERROR出る(TдT) -- 3/************************************************************/ 4function Huton_Ga_Hutton_Da() { 5 6 /************************************************************/ 7 // 変数宣言 8 /************************************************************/ 9 var sarch = "@"; // 検索対象文字 10 var id = "TextArea_xxxx_xxxx_xxxx_$TextField"; // 取得対象テキストID 11 var split = /,|;/; // 分割対象文字 12 var c = 0; // カウンタ(初期化) ★New 13 var newDomain = ""; // "@"(ドメイン)のみ格納用配列 ★New 14 15 /************************************************************/ 16 // 取得処理開始!!! 17 /************************************************************/ 18 19 /* 1. 対象テキストから、値を取得し分割 */ 20 var text = document.getElementById(id).value; // テキストボックスから、値を取得 21 var domain = text.split(split); // 取得した値を、分割し配列へ格納 22 23 /* 2. 格納した文字列の修整 */ 24 for (var i = 0; i < domain.length; i++) { // LOOP 25 domain[i] = domain[i].replace(/\s+/g, ""); // 不要スペース削除 26 27 /* 3. "@" ドメイン取得 */ 28 if (domain[i].indexOf(sarch) >= 0) { // 配列検索 : "@" 29 newDomain[c] = domain[i].substring(domain[i].indexOf(sarch)); // "@"以降取得 ★New 30 c++; // カウントアップ ★New 31 } 32 } 33 34 /* 4. 重複Check */ 35 var modifyDomain = newDomain.filter(function(x, z, self) { // 重複Check 36 return self.indexOf(x) === z; // 重複データ削除 37 }); 38 39 /************************************************************/ 40 // 出力! 41 /************************************************************/ 42 alert(modifyDomain.toString()); 43}
自分の考えでは、【/* 3. "@" ドメイン取得 */】の、"if文"の箇所で、格納出来ないかと考えました。
1."@"ドメインのみ格納する「配列:newDomain」を宣言。
2.「配列:newDomain」の『添字用配列:c』を宣言。
3.『添字用配列:c』のカウントアップの為、"c++;"を追記。
実行すると、『変数:c が宣言されていません。」と出てしまい、if文の所でエラーになります。
Function内で変数宣言している為、参照出来るとは思うのですが・・・
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
①長くなりましたが、配列の添字用に変数を宣言しても使用出来ないという事でしょうか?
②配列の添字は、"for文"のように、ループ処理内でしかカウントアップ出来ないものですか?
③元のテキストから、"@"ドメインのみ配列に取得する良い方法があれば、ご教示頂ければと思います。
よろしくお願い致します。
補足情報(言語/FW/ツール等のVersion)
・言語:JavaScript
回答4件
あなたの回答
tips
プレビュー