0

私は電子メールヘッダーを読んでいます(Node.jsで、スコアを保持している人向け)。それらはさまざまです。フィールド内の電子メール アドレスは次のtoようになります。

"Jake Smart" <jake@smart.com>, jack@smart.com, "Development, Business" <bizdev@smart.com>

など、さまざまな形式があります。これをすべて解析する方法はありますか?

ここに私の最初の刺し傷があります:

  1. split()onを実行し-て、さまざまな人々を配列に分割します
  2. 各項目について、 または がある<かどうかを確認し"ます。
  3. がある場合<は、電子メールを解析します
  4. がある場合"は、名前を解析します
  5. 名前については、 がある場合は,、分割して姓、名を取得します。

最初に で分割を行う,Development, Business、 で分割エラーが発生します。スペースも矛盾しています。さらに、これまでに見たことのない、ヘッダーに表示される電子メール アドレスの形式が他にもあるかもしれません。これをすべて行う方法 (または素晴らしい Node.js ライブラリ) はありますか?

4

4 に答える 4

5

これにはnpmモジュールがあります-mimelib(または、Windowsを使用している場合、またはnode-iconvをコンパイルしたくない場合はmimelib-noiconv)

npm install mimelib-noiconv

使用法は次のようになります。

var mimelib = require("mimelib-noiconv");
var addressStr = 'jack@smart.com, "Development, Business" <bizdev@smart.com>';
var addresses = mimelib.parseAddresses(addressStr);

console.log(addresses);
// [{ address: 'jack@smart.com', name: '' },
//  { address: 'bizdev@smart.com', name: 'Development, Business' }]
于 2012-02-28T20:51:04.163 に答える
3

そのための実際のフォーマットはかなり複雑ですが、これが機能する正規表現です。ただし、常に機能するとは約束できません。https://www.rfc-editor.org/rfc/rfc2822#page-15

const str = "...";
const pat = /(?:"([^"]+)")? ?<?(.*?@[^>,]+)>?,? ?/g;

let m;
while (m = pat.exec(str)) {
  const name = m[1];
  const mail = m[2];

  // Do whatever you need.
}
于 2012-02-28T03:55:54.147 に答える
0

私はそれをすべて1回の反復(パフォーマンス)で実行しようとします。一緒に投げただけです(限定テスト):

var header = "\"Jake Smart\" <jake@smart.com>, jack@smart.com, \"Development, Business\" <bizdev@smart.com>";
alert (header);
var info = [];
var current = [];
var state = -1;
var temp = "";
for (var i = 0; i < header.length + 1; i++) {
  var c = header[i];
  if (state == 0) {
    if (c == "\"") {
      current.push(temp);
      temp = "";
      state = -1;
    } else {
      temp += c;
    }
  } else if (state == 1) {
    if (c == ">") {
      current.push(temp);
      info.push (current);
      current = [];
      temp = "";
      state = -1;
    } else {
      temp += c;
    }
  } else {
    if (c == "<"){
      state = 1;
    } else if (c == "\"") {
      state = 0;
    }
  }
}

alert ("INFO: \n" + info);
于 2012-02-28T03:42:09.753 に答える
0

完全なものを得るには、これを JS に移植する必要があります: http://cpansearch.perl.org/src/RJBS/Email-Address-1.895/lib/Email/Address.pm

必要なすべての部品を提供します。トリッキーなビットは、最初の正規表現のセットです。

于 2012-02-28T16:57:24.977 に答える