如何从字符串中获取名字和姓氏?

时间:2012-09-26 16:31:06

标签: php

我有一个这样的字符串:

“红蓝绿深灰紫”

我希望输出一个函数:

“红色,蓝色,绿色,深灰色,紫色”

我想要将大写第一个字母彼此相邻的单词作为一个标签,同样的东西是3,4,5 ......单词旁边一个大写的。

另一个例子:

“柠檬橙苹果美味黑莓”==> “柠檬,橘子,苹果,美味的黑莓”

1 个答案:

答案 0 :(得分:2)

是的,这是一个糟糕的问题,但对我来说这似乎是一个很好的挑战。您可以使用此正则表达式。

/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/

PHP代码:

$string = 'red blue green Dark Grey purple';
preg_match_all('/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/', $string, $ans);

print_r($ans[0]); /*  Array
                   *  (
                   *    [0] => red
                   *    [1] => blue
                   *    [2] => green
                   *    [3] => Dark Grey
                   *    [4] => purple
                   *  )                     
                   */

$string = 'lemon orange apple Delicious Black Berry';
preg_match_all('/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/', $string, $ans);

print_r($ans[0]); /*  Array
                   *  (
                   *    [0] => lemon
                   *    [1] => orange
                   *    [2] => apple
                   *    [3] => Delicious Black Berry
                   *  ) 
                   */

正则表达式的解释。这分为两部分。一部分寻找以大写字母(([A-Z][a-z]* ?)+?(?= |$))开头的单词,另一部分寻找小写单词([a-z]+)。因此,我将从大写字母部分开始分两部分进行解释。

  • (([A-Z][a-z]* ?)+?(?= |$)) Explanation
  • ([A-Z][a-z]* ?)+? - ([匹配大写字母] [后跟0或更多小写字母](后跟空格或空格)至少一次,但最少可能与模式匹配
  • (?= |$) - (不匹配但确保下一个字符是空格或字符串的结尾)

如果没有匹配项,则会尝试:

  • ([a-z]+) Explanation
  • ([a-z]+) - [尽可能多次匹配至少1个小写字母]

享受。 :)