php - 解析类似电子邮件的 header (类似于 RFC822)

标签 php regex parsing rfc822

问题/问题

有一个database of bot information我想解析。据说是similar to RFC822 messages .

在我重新发明轮子并编写自己的解析器之前,我想我会看看是否还有其他可用的东西。我偶然发现 imap_rfc822_parse_headers() ,这似乎正是我想要的。不幸的是,IMAP 扩展在我的环境中不可用。

我在网上和 Stack Overflow 上看到了很多替代方案。不幸的是,它们都是为电子邮件而构建的,并且做的比我需要的更多……经常解析整个电子邮件并以特殊方式处理标题。我只想简单地将这些 header 解析为一个有用的对象或数组。

是否有 imap_rfc822_parse_headers() 的直接 PHP 版本可用的,或者类似的东西可以解析这样的数据?如果没有,我会自己写。

样本数据

robot-id: abcdatos
robot-name: ABCdatos BotLink
robot-from: no
robot-useragent: ABCdatos BotLink/1.0.2 (test links)
robot-language: basic
robot-description: This robot is used to verify availability of the ABCdatos
                   directory entries (http://www.abcdatos.com), checking
                   HTTP HEAD. Robot runs twice a week. Under HTTP 5xx
                   error responses or unable to connect, it repeats
                   verification some hours later, verifiying if that was a
                   temporary situation.
robot-history: This robot was developed by ABCdatos team to help
               working in the directory maintenance.
robot-environment: commercial
modified-date: Thu, 29 May 2003 01:00:00 GMT
modified-by: ABCdatos

robot-id:                       acme-spider
robot-name:                     Acme.Spider
robot-cover-url:                http://www.acme.com/java/software/Acme.Spider.html
robot-exclusion:                yes
robot-exclusion-useragent:      Due to a deficiency in Java it's not currently possible to set the User-Agent.
robot-noindex:                  no
robot-host:                     *
robot-language:                 java
robot-description:              A Java utility class for writing your own robots.
robot-history:                  
robot-environment:              
modified-date:                  Wed, 04 Dec 1996 21:30:11 GMT
modified-by:                    Jef Poskanzer

...

最佳答案

假设 $data包含您在上面粘贴的示例数据,这里是解析器:

<?php

/* 
 * $data = <<<'DATA'
 * <put-sample-data-here>
 * DATA;
 *
 */

$parsed  = array();
$blocks  = preg_split('/\n\n/', $data);
$lines   = array();
$matches = array();
foreach ($blocks as $i => $block) {
    $parsed[$i] = array();
    $lines = preg_split('/\n(([\w.-]+)\: *((.*\n\s+.+)+|(.*(?:\n))|(.*))?)/',
                        $block, -1, PREG_SPLIT_DELIM_CAPTURE);
    foreach ($lines as $line) {
        if(preg_match('/^\n?([\w.-]+)\: *((.*\n\s+.+)+|(.*(?:\n))|(.*))?$/',
                      $line, $matches)) {
            $parsed[$i][$matches[1]] = preg_replace('/\n +/', ' ',
                                                    trim($matches[2]));
        }
    }
}

print_r($parsed);

关于php - 解析类似电子邮件的 header (类似于 RFC822),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804880/

相关文章:

regex - DART 中的负后视等价物?

java - 将类似 JavaScript 的语法解析为我自己的 Java 方法

java - 匹配所有 java 导入的正则表达式,但具有特定结尾的除外

php - 插入cookie并输入值mysqli

php - 使用 PHP 选择特定的 Tumblr XML 值

将 MySQL 查询转换为 CSV 的 PHP 代码

regex - 开始,尝试循环日期正则表达式结果

json - 将选项对象解析为选项列表

parsing - 为什么解释/脚本语言很少有多行注释?

php - 在 PHP 中对数组使用 str_repeat 来获取日历中特定日期的事件