Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在PHP中拆分名字和姓氏的最佳方法

在PHP中拆分名字和姓氏的最佳方法
EN

Stack Overflow用户
提问于 2012-01-10 18:58:54
回答 16查看 27.9K关注 0票数 14

我不得不使用NAME字段,它的格式通常是:

代码语言:javascript
代码运行次数:0
复制
FirstName LastName

但是,我偶尔也会有这些格式(带前缀或后缀)的名称:

代码语言:javascript
代码运行次数:0
复制
Mr. First Last
First Last Jr.

人们认为在PHP中将这些变量分成名字/姓氏变量的安全方法是什么?我真的想不出任何东西总是有效的……

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2012-01-10 19:14:44

正则表达式是处理这类事情的最好方法。试试这个--它会提取出前缀、名字、姓氏和后缀:

代码语言:javascript
代码运行次数:0
复制
$array = array(
    'FirstName LastName',
    'Mr. First Last',
    'First Last Jr.',
    'Shaqueal O’neal',
    'D’angelo Hall',
);

foreach ($array as $name)
{
    $results = array();
    echo $name;
    preg_match('#^(\w+\.)?\s*([\'\’\w]+)\s+([\'\’\w]+)\s*(\w+\.?)?$#', $name, $results);
print_r($results);
}

结果是这样的:

代码语言:javascript
代码运行次数:0
复制
FirstName LastName
Array
(
    [0] => FirstName LastName
    [1] => 
    [2] => FirstName
    [3] => LastName
)
Mr. First Last
Array
(
    [0] => Mr. First Last
    [1] => Mr.
    [2] => First
    [3] => Last
)
First Last Jr.
Array
(
    [0] => First Last Jr.
    [1] => 
    [2] => First
    [3] => Last
    [4] => Jr.
)
shaqueal o’neal
Array
(
    [0] => shaqueal o’neal
    [1] => 
    [2] => shaqueal
    [3] => o’neal
)
d’angelo hall
Array
(
    [0] => d’angelo hall
    [1] => 
    [2] => d’angelo
    [3] => hall
)

etc…

所以在数组中,$array[0]包含整个字符串。$array[2]始终是名字,$array[3]始终是姓氏。$array[1]是前缀,$array[4] (并非总是设置)是后缀。我还为像Shaqueal O‘’neal和D‘also这样的名字添加了处理’and‘的代码。

票数 24
EN

Stack Overflow用户

发布于 2013-01-19 23:54:23

被接受的答案不适用于英语以外的语言,也不适用于像“奥斯卡·德拉霍亚”这样的名字。

下面是我所做的一些事情,我认为utf-8是安全的,适用于所有这些情况,建立在公认答案的假设上,即前缀和后缀将有一个句点:

代码语言:javascript
代码运行次数:0
复制
/**
 * splits single name string into salutation, first, last, suffix
 * 
 * @param string $name
 * @return array
 */
public static function doSplitName($name)
{
    $results = array();

    $r = explode(' ', $name);
    $size = count($r);

    //check first for period, assume salutation if so
    if (mb_strpos($r[0], '.') === false)
    {
        $results['salutation'] = '';
        $results['first'] = $r[0];
    }
    else
    {
        $results['salutation'] = $r[0];
        $results['first'] = $r[1];
    }

    //check last for period, assume suffix if so
    if (mb_strpos($r[$size - 1], '.') === false)
    {
        $results['suffix'] = '';
    }
    else
    {
        $results['suffix'] = $r[$size - 1];
    }

    //combine remains into last
    $start = ($results['salutation']) ? 2 : 1;
    $end = ($results['suffix']) ? $size - 2 : $size - 1;

    $last = '';
    for ($i = $start; $i <= $end; $i++)
    {
        $last .= ' '.$r[$i];
    }
    $results['last'] = trim($last);

    return $results;
}

下面是phpunit测试:

代码语言:javascript
代码运行次数:0
复制
public function testDoSplitName()
{
    $array = array(
        'FirstName LastName',
        'Mr. First Last',
        'First Last Jr.',
        'Shaqueal O\'neal',
        'D’angelo Hall',
        'Václav Havel',
        'Oscar De La Hoya',
        'АБВГҐД ЂЃЕЀЁЄЖЗ', //cyrillic
        'דִּיש מַחֲזֹור', //yiddish
    );

    $assertions = array(
            array(
                    'salutation' => '',
                    'first' => 'FirstName',
                    'last' => 'LastName',
                    'suffix' => ''
                ),
            array(
                    'salutation' => 'Mr.',
                    'first' => 'First',
                    'last' => 'Last',
                    'suffix' => ''
                ),
            array(
                    'salutation' => '',
                    'first' => 'First',
                    'last' => 'Last',
                    'suffix' => 'Jr.'
                ),
            array(
                    'salutation' => '',
                    'first' => 'Shaqueal',
                    'last' => 'O\'neal',
                    'suffix' => ''
                ),
            array(
                    'salutation' => '',
                    'first' => 'D’angelo',
                    'last' => 'Hall',
                    'suffix' => ''
                ),
            array(
                    'salutation' => '',
                    'first' => 'Václav',
                    'last' => 'Havel',
                    'suffix' => ''
                ),
            array(
                    'salutation' => '',
                    'first' => 'Oscar',
                    'last' => 'De La Hoya',
                    'suffix' => ''
                ),
            array(
                    'salutation' => '',
                    'first' => 'АБВГҐД',
                    'last' => 'ЂЃЕЀЁЄЖЗ',
                    'suffix' => ''
                ),
            array(
                    'salutation' => '',
                    'first' => 'דִּיש',
                    'last' => 'מַחֲזֹור',
                    'suffix' => ''
                ),
        );

    foreach ($array as $key => $name)
    {
        $result = Customer::doSplitName($name);

        $this->assertEquals($assertions[$key], $result);
    }
}
票数 19
EN

Stack Overflow用户

发布于 2012-01-10 19:13:02

你不会找到一个安全的方法来解决这个问题,即使是人类也不能总是区分哪些部分属于名字,哪些属于姓氏,特别是当其中一个包含几个单词时,比如: Andrea Frank Gutenberg。中间部分Frank可以是第二个名字,也可以是姓氏和婚前姓Gutenberg。

你能做的最好的事情是,为名字和姓氏提供不同的输入域,并将它们安全地分隔在数据库中,这样你就可以避免很多问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8808902

复制
相关文章
为传统设备提供更好的视频编码
Netfilx 在全球目前已有约193M的会员,而人们会使用各种各样的流媒体设备,包括手机、智能电视、机顶盒以及游戏主机等。并且不同播放设备所处的网络环境也存在不同。因此就需要能够使用各种各样的编码配置和编码器来对不同的播放条件进行适配,以实现针对性的提供更加优质高效的视频服务。
用户1324186
2021/11/23
3750
Dropbox为微软Office提供原生云存储服务
北京时间11月5日消息,云存储服务提供商Dropbox宣布与微软达成协议,将对后者旗下的桌面、移动及网页版Office套件提供原生的云服务支持。同时,Office也将成为Dropbox用户编辑Word、Excel和PowerPoint等文档的标准应用。 根据协议,Dropbox的用户可以将其账户与微软Office的iPad应用建立关联,从而支持快速地文件视图、编辑并保存至云端。默认状态下,通过Dropbox网页应用实现的文件编辑可通过微软Office网页应用实现,保存在云端的文档无需回存至Dropbox。
静一
2018/03/20
2.4K0
(译)为容器提供更好的隔离:沙箱容器技术概览
既然主流 IT 工业都在采用基于容器的基础设施(云原生方案),那么了解这一技术的短板就很重要了。Docker、LXC 以及 RKT 等传统容器都是共享主机操作系统核心的,因此不能称之为真正的沙箱。这些技术的资源利用率很高,但是受攻击面积和潜在的攻击影响都很大,在多租户的云环境中,不同客户的容器会被同样的进行编排,这种威胁就尤其明显。主机操作系统在为每个容器创建虚拟的用户空间时,不同容器之间的隔离是很薄弱的,这是造成上述问题的根本原因。基于这样的现状,真正的沙箱式容器,成为很多研发工作的焦点。多数方案都对容器之间的边界进行了重新架构,以增强隔离。本文覆盖了四个项目,分别来自于 IBM、Google、Amazon 以及 OpenStack,几个方案的目标是一致的:为容器提供更强的隔离。IBM Nabla 在 Unikernel 的基础上构建容器;Google 的 gVisor 为运行的容器创建一个特定的内核;Amazon 的 Firecracker 是一个超轻量级的沙箱应用管理程序;OpenStack 将容器置入特定的为容器编排平台优化的虚拟机之中。下面对几个方案的概述,有助于读者应对即将到来的转型机会。
崔秀龙
2019/07/24
3.1K0
(译)为容器提供更好的隔离:沙箱容器技术概览
PHP取URL根域名的方法
PHP根据URL提取主域名,在网上荡了一个! 优化了一下域名库,修复了PHP7.0! 可以直接拿来用,测试了一下没发现问题! <?php  #使用示例 echo getBaseDomain('http
V站CEO-西顾
2018/06/09
6.2K1
为用户和开发者提供更好的评分和评价
作者 / Google Play 产品经理 Tom Grinsted、Scott Lin 和 Tat Yang Koh
Android 开发者
2022/03/10
7370
为用户和开发者提供更好的评分和评价
静态成员在PHP中是怎么继承的?
静态成员,也就是用static修饰的变量或者方法,如果搞不清楚它们实现的原理,就很容易会出现一些错误。这次我们来研究的是在继承中静态成员的调用情况。首先来看这样一段代码:
硬核项目经理
2020/02/17
1.4K0
腾讯云携手Commvault,为云上用户提供安全存储服务
11月2日获悉,腾讯云对象存储COS近日正式通过Commvault备份软件标准化测试,并获得官方认证。
云存储
2020/11/05
2.8K0
腾讯云携手Commvault,为云上用户提供安全存储服务
华为:用傲腾SSD提供更好的智能计算服务
过去多年,华为智能产品线得到了很大发展。华为智能计算产品线SSD业务总经理赵春辉介绍,今年Q1比去年同期增长70%以上,业务发展势头旺盛。这得益于公司在相关领域的技术投入,也离不开英特尔这样合作伙伴的帮助。
冬瓜哥
2019/06/10
7590
华为:用傲腾SSD提供更好的智能计算服务
在图像的傅里叶变换中,什么是基本图像_傅立叶变换
大家好,又见面了,我是你们的朋友全栈君。 从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。 傅立叶变换属于调和分析的内容。”分析”二字,可以解释为深入的研究。从字面上来看,”分析”二字,实际就是”条分缕析”而已。它通过对函数的”条分缕析”来达到对复杂函数的深入理解和研究。从哲学上看,”分析主义”和”还原主义”,就是要通过对事物内部适当的分析达到增进对其本质理解的目的。比如近代原子论试图把世界上所有物质的本源分析为原子,而原子不过数百种而已,相对物质世界的无限丰富,这种分析和分类无疑为认识事物的各种性质提供了很好的手段。 在数学领域,也是这样,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。”任意”的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!奇妙的是,现代数学发现傅立叶变换具有非常好的性质,使得它如此的好用和有用,让人不得不感叹造物的神奇: 1. 傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子; 2. 傅立叶变换的逆变换容易求出,而且形式与正变换非常类似; 3. 正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取; 4. 著名的卷积定理指出:傅立叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段; 5. 离散形式的傅立叶变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT)). 正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。 傅立叶变换在图像处理中有非常非常的作用
全栈程序员站长
2022/09/27
1.4K0
PHP判断URL的合法性字符串是否为 URL 链接
前言: 有好多小伙伴在爬虫的时候,或者其他情况下无法精确判断一个字符串是不是一个标准URL链接地址从而很费脑,下面我么看一下怎么判断URL的合法性。 以下代码均为PHP语言代码,但语言都是相通的。 第
骤雨重山
2022/01/17
1.5K0
为同行提供服务:华为AP刷新固件,并且在AC中配置上线
昨天帮助同行远程调试华为的AC和AP,却总是断线,改了AC上面的VLAN1的管理IP,虽然AC不断线了,但是AP无法上线,提示版本不匹配。
IT狂人日志
2022/05/18
1.8K0
为同行提供服务:华为AP刷新固件,并且在AC中配置上线
PHP检测URL是否为域名格式
PHP判断这个域名是否是正确的域名,正确的url地址 1.正则 //检测域名格式 function CheckUrl($C_url){ $str="/^http(s?):\/\/(?:
V站CEO-西顾
2018/06/09
12.2K1
在 Php 中把 Allow_url_fopen 打開的風險[通俗易懂]
最近老是在我的 /tmp 裡頭, 發現有個多出來的 /tmp/cmdtemp 檔案. 也在 apache 的 error_log 中發現一些訊息如下:
全栈程序员站长
2022/09/13
2K0
数据库中存储的是什么?数据库存取的是地址
比如用户想看视频,用户通过浏览器访问视频网站的网址,视频网站服务器解析用户浏览器的请求(url),然后服务器访问视频网站的数据库服务器,从数据库服务器中得到该视频存放的地址(路径),然后返回给用户浏览器,用户浏览器再利用此地址访问该视频,即完成了一次查看视频的网络服务。
全栈程序员站长
2022/07/21
1.6K0
PHP的URL处理
完整URL地址: http://username:password@hostname/path?arg=value#auchor 协议:http:// 用户名和密码: username:passw
Java架构师必看
2021/03/22
3.8K0
在Flutter中设置更好的Logging的指南
今天,我们将研究可以极大减少应用程序调试时间的任务之一。一旦您习惯了在您的应用程序中以某种方式运行的日志,您将很快能够注意到为什么某些东西不起作用。您可以查看应用程序的流程,如果需要,还可以查看更多内容。
玖柒的小窝
2021/10/05
1.8K0
在Flutter中设置更好的Logging的指南
学习PHP中的URL相关操作函数
在日常的业务开发过程中,我们经常会有处理 URL 链接的需求,所以今天学习的函数其实都是大家经常会使用的一些函数。在之前的工作过程中,其实我对这些函数都只是有一个模糊的概念,知道,但是真要用得时候还是要看下文档才能确定真正要使用的是哪一个函数。因此,今天我们就当做是一次复习练习,主要是区分和搞清楚每个函数真正的用处。
硬核项目经理
2021/11/10
2.5K0
DataOps ETL 如何更好地为您的业务服务
据 Gartner Group 称,数据集成、迁移和商业智能项目在至少 70% 的案例中第一次尝试就失败了。商业组织产生(和要求)比以往任何时候都多的数据,但是,失败率令人震惊。在当今的任何业务中,ETL 技术都是数据分析的基础。数据仓库、数据集市和其他重要的数据存储库都加载了从事务应用程序中提取并转换为在商业智能应用程序中进行分析的数据。
DevOps云学堂
2022/10/04
4380
DataOps ETL 如何更好地为您的业务服务
点击加载更多

相似问题

在PHP中验证URL的更好方法

22

PHP图像上传存储为url

20

在php中路由URL的更好方法

13

使用PHP显示存储在SQL数据库中的URL图像

23

PHP -存储图像到数据库还是文件更好?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文