正则表达式 - 返回名字和姓氏

Ali*_*xel 2 php regex string

我正在寻找最可靠的方法来返回给出全名的人的名字和姓氏,到目前为止,我能想到的最好的是以下正则表达式:

$name = preg_replace('~\b(\p{L}+)\b.+\b(\p{L}+)\b~i', '$1 $2', $name);
Run Code Online (Sandbox Code Playgroud)

预期的输出应该是这样的:

William -> William // Regex Fails
William Henry -> William Henry
William Henry Gates -> William Gates
Run Code Online (Sandbox Code Playgroud)

我也希望它支持口音,例如"João".

编辑:我理解一些名称将无法正确识别,但这对我来说不是问题,因为这将用于本地站点,其中最后一个字是姓氏(虽然可能不是整个姓氏) )但这不是一个问题,因为我想要的只是一个快速的方式来说"亲爱的FIRST_NAME LAST_NAME"......所以所有这些讨论虽然完全有效,但对我来说毫无用处.

有人可以帮我弄这个吗?

Tho*_*ens 7

这可能不是您想听到的,但我不认为这个问题适合于正则表达式,因为名称不是常规的.我不认为他们甚至是上下文敏感或无上下文.如果有的话,它们是不受限制的(我必须坐下来,并且认为通过比我之前所做的更多,但是肯定地说,并且没有正则表达式引擎可以解析不受限制的语法.


Dom*_*ger 6

而不是正则表达式,你可能会发现更容易做类似的事情:

$parts = explode(" ", $name);
$first = $parts[0];
$last = ""
if (count($parts) > 1) {
    $last = $parts[count($parts) - 1];
}
Run Code Online (Sandbox Code Playgroud)

您可能希望首先用一个空格替换多个连续的空白位,这样就不会得到空位,并且去掉尾随/前导空格:

$name = ereg_replace("[ \t\r\n]+", " ", trim($name));
Run Code Online (Sandbox Code Playgroud)

  • +1,正则表达式可能是解决这个问题的最糟糕方法. (2认同)