-1

次の形式に従う電子メールを解析する必要があります。

こんにちはJohnDoe、
ここにもう少しテキストがあります。
そして、さらに多くの、そしてより多くのテキスト。
ユーザーIDは次
のとおりです。1234アクティベーションIDは次のとおりです。5678910
さらに多くのテキストがここに表示されます。

私が探している正規表現は返送する必要があります:

  1. 敬礼の名前(ここでは「JohnDoe」)
  2. ユーザーID(ここでは:1234)
  3. アクティベーションID(ここ:5678910)

次の正規表現を試しましたが、メール全体が返されました。私が犯している間違いは、電子メール本文の残りの部分に他のコンマがあるため、コロンがそれらすべてに一致することだと思います。ユーザーがコンマを含む奇妙なユーザー名を入力した場合、敬礼の名前にもコンマを含めることができます。

preg_match_all("/Hi (.*),/", $out, $match);
4

2 に答える 2

2

正規表現パターンを使用

/Hi (.*?),\n.*?user ID is: (\d+).*?activation ID is: (\d+)/s
      ↑                      ↑                         ↑
  "John Doe"              "1234"                   "5678910"

PHP コード:

$pattern = '/Hi (.*?),\n.*?user ID is: (\d+).*?activation ID is: (\d+)/s';
preg_match($pattern, $email, $m);
print("$m[1]\n$m[2]\n$m[3]");

出力:

John Doe
1234
5678910

このデモを確認してください。

于 2012-10-16T18:02:08.473 に答える
1

各フィールドに 1 つの正規表現を使用します。

$match = array();
$regexs = array(
    '~Hi\s+(.+?),~', // notice ? -> "greedy killer"
    '~Your user ID is: (\d+)~',
    '~Your activation ID is: (\d+)~')

if( !preg_match( $regexs[0], $text, $match)){
    throw new Exception('Invalid mail format, cannot find user name');
}

// .. and so on for each field

ただし、すべてを1つの正規表現に入れることができます(名前付きサブパターンを使用すると読みやすくなります:

$regexp = '~Hi\s+(?P<name>.+?)|Your user ID is: (?P<id>\d+)|Your activation ID is: (?P<activation_id>\d+)~';
$matches = array();
preg_match_all( $regexp, $text, $matches, PREG_SET_ORDER);
foreach( $matches as $match){
    print_r( $match);
    if( !empty( $match['name'])){
       // Having a name
    }
}
于 2012-10-16T18:01:53.153 に答える