PHP正则表达式获得UPPERCASE名称

时间:2012-05-04 12:30:38

标签: php regex unicode uppercase

我有这些名字:

John Stuart AGNEW
Magdi Cristiano ALLAM
Josefa AÉNDRÉS BARÉA 
Josefa ANDRES BAREA
Laima Liucija ANDRIKIENĖ

我希望获得具有所有大写字符的名称

例如,对于John Stuart AGNEW我想要 AGNEW

我遇到Josefa AÉNDRÉS BARÉA的问题。我想获得AÉNDRÉSBARÉA

我使用了这个正则表达式:(.*) (.[A-Z]{2,100} .[A-Z]{2,100})

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

根据this \p{Lu}应该匹配任何大写字母。因此,将正则表达式替换为类似的结果:(.*) (.\p{Lu}{2,100} .\p{Lu}{2,100})应该可以正常工作。

我做了一些修改,这会使你的正则表达式稍微宽容一些。 (\p{Lu}{2,100}( \p{Lu}{2,100})?)。但是我没有使用PHP的经验,所以我无法正确测试它。

然而,我已经在Java环境中对它进行了测试,它对我有用。

答案 1 :(得分:0)

我会用:

([A-ZÁÉÍÓÚÜ]{2,})

然后使用:

连接匹配项
$result = implode(" ", $matches);

答案 2 :(得分:0)

我尝试了这个,它可能就是你需要的

<?php

$s = 'John Stuart AGNEW
Magdi Cristiano ALLAM
Josefa AÉNDRÉS BARÉA
Josefa ANDRES BAREA
Laima Liucija ANDRIKIENE
Ronald McDONALD
';

$pat = "/\p{Lu}{2,}.*/";
preg_match_all( $pat, $s, $ms);

foreach( $ms[0] as $m){
    echo $m . "<br />\n";
}

?>

请注意,像McDONALD这样的名字是混合案例,您是否也支持这些?

答案 3 :(得分:0)

您的第一个(.*)应该是非贪婪的,例如:(.*?),这样就不会开始接受来自名称大写部分的字母。

然后正如其他人所提到的,您可以将范围[A-Z]扩展为[A-ZÁÉÍÓÚÜ]