在PHP中解析电子邮件正则表达式

时间:2014-02-13 12:02:10

标签: php regex

我在文件中有以下字符串。

BEGIN:VCALENDARPRODID://Yahoo//Calendar
//ENVERSION:2.0METHOD:REQUESTBEGIN:VEVENTSUMMARY:Review MeetingDESCRIPTION:Testing the 
yahoomail eventCLASS:PUBLICDTSTART;TZID=Etc/GMT:20140213T163000ZDTEND;TZID=Etc
/GMT:20140213T173000ZLOCATION:ChennaiPRIORITY:0SEQUENCE:1UID:252f25fc-
a39c-4121-9835-774a6c558b33ATTENDEE;RSVP=TRUE:mailto:aaa@aaa.comATTENDEE;
RSVP=TRUE:mailto:bbb@aaa.comATTENDEE;RSVP=TRUE:mailto:xxxin@yahoo.inATTENDEE;
RSVP=TRUE:mailto:test.test@test.orgATTENDEE;RSVP=TRUE:mailto:xxx@xxx.mailgun.orgORGANIZER;
CN=Sherin jemima G;SENT-
BY="mailto:xxxin@yahoo.in":mailto:xxxin@yahoo.inTRANSP:OPAQUEEND:VEVENTBEGIN:VTIMEZONETZID:
Europe/London+0100TZNAME:BSTDTSTART:19810329T010000RRULE:FREQ=YEARLY;BYMONTH=3;
BYDAY=-1SUEND:DAYLIGHTBEGIN:STANDARDTZOFFSETFROM:+0100TZOFFSETTO:+0000TZNAME:GMTDTSTART:199
61027T020000RRULE:FREQ=YEARLY;BYMONTH=10;
BYDAY=-1SUEND:STANDARDBEGIN:STANDARDTZOFFSETFROM:-000115TZOFFSETTO:+0000TZNAME:GMTDTSTART:1
8471201T000000RDATE:18471201T000000END:STANDARDBEGIN:DAYLIGHTTZOFFSETFROM:+0000TZOFFSETTO:+
0100TZNAME:BSTDTSTART:19160521T020000

编辑:不必要的线路。

我使用了file_get_contents函数来读取字符串,并使用preg_match_all函数来获取与会者列表。

<?php
    preg_match_all('/mailto:(.*?)(.com|.org|.net|.in)/', $convert, $emails);
    echo "<pre>";
    print_r($emails[0]);
    echo "</pre>";
    ?>

输出:

[0] => Array
        (
            [0] => mailto:aaa@aaa.com
            [1] => mailto:bbb@bbb.com
            [2] => mailto:xxxin
            [3] => mailto:test.test@test.org
            [4] => mailto:xxx@xxx.mailgun.org
            [5] => mailto:xxxin
            [6] => mailto:xxxin
        )

预期产出:

[0] => Array
        (
            [0] => mailto:aaa@aaa.com
            [1] => mailto:bbb@bbb.com
            [2] => mailto:xxxin@yahoo.in
            [3] => mailto:test.test@test.org
            [4] => mailto:xxx@xxx.mailgun.org
            [5] => mailto:xxxin@yahoo.in
            [6] => mailto:xxxin@yahoo.in
        )

请帮助我实现这一目标。

2 个答案:

答案 0 :(得分:4)

逃离正则表达式中的点:

preg_match_all('/mailto:(.*?)(\.com|\.org|\.net|\.in)/', $convert, $emails);

答案 1 :(得分:2)

您的正则表达式不是在寻找@符号。

这已经提供了更好的结果:

'/mailto:(.*?)@(.*?)(\.com|\.org|\.net|\.in)/'

列出顶级域名的事实并不是一个好主意。有超过250个国家的tlds,数百个即将到来。

您的文件结构存在缺陷,它没有电子邮件的结束分隔符。你必须先解决这个问题。之后,就可以编写一个好的正则表达式解析器。