首页 > 解决方案 > PHP:将名称部分从名称解析器(theiconic)映射到 vCard 属性

问题描述

我面临将一串名称数据$realName转换为(正确的)vCard 属性的情况。

作为解析器,theiconic name-parser似乎最适合我的目的(该库目前正在维护,经常下载,并且已经考虑到德国特性)。

源字符串$realName可以同时包含:人名或公司名。因此,它的组件可以(从我的 pov 中)分配给以下 vCard 属性:

另一方面,名称解析器提供以下组件(或空字符串):

据此 - 这是我到目前为止的映射:

    /**
     * get an array of name parts vCard property as key
     * 
     * @param string $realname
     * @return array
     */
    function getNameParts(string $realName)
    {
        $parser = new Parser();
        $nameParts = $parser->parse($realName);
        $salutation = $nameParts->getSalutation();
        $firstName  = $nameParts->getFirstname();
        $lastName   = $nameParts->getLastname();
        $middleName = $nameParts->getMiddlename();
        $nickName   = $nameParts->getNickname();
        $initials   = $nameParts->getInitials();
        $suffix     = $nameParts->getSuffix();

        if (!empty($firstName)) {
            $additionalName = implode(',', [$middleName, $initials]);
            $name = implode(';', [$lastName, $firstName, $additionalName, $salutation, $suffix]);
            $fullName = implode(' ', [$salutation, $firstName, $additionalName, $lastName]).', '.$suffix;  
        } else {
            $name = '';
            $fullName = $realName;
            $company = $realName;
        }

        return [
            'N'        => $name,
            'FN'       => $fullName,
            'NICKNAME' => $nickName,
            'ORG'      => $company,
        ]
    }

我不太熟悉美国/英国的名称组件规则、它们的正确分配和顺序(例如 FN)。我也不知道如何确定$realName代表公司名称还是个人。

因此,我想知道其他人是否有同样的任务,如果这会朝着正确的方向发展,可以看看它。

很多谢谢

标签: phpparsingvcf-vcard

解决方案


我已经为自己找到了一个满意的解决方案:https ://github.com/theiconic/name-parser/pull/40 希望其他人可以使用它。


推荐阅读