php正则表达式提取部分文本

时间:2013-03-08 20:56:15

标签: php extract

我需要从数据库中提取,其中一列中的记录以这种方式组合: 第一个字母(名字1)。姓氏1,第一个字母(名字2)。 Lastname2,....

这是我试图解决的一个例子......

     $text2= "T. Toth, M. A. Carlo de Miller, T. Stallone";
     $keywords = preg_split("/,/", "$text2");

     print_r($keywords);

    //I got a result in this way:

    //Array ( [0] => T. Toth [1] => M. A. Carlo de Miller [2] => T. Stallone ) 

    // I want a result of the form :

    //Array ( [0] => T [1] => Toth [2] => M. A. [3] => Carlo de Miller [4] => T  and    so on....

有人可以了解如何继续进行?即使它可以在MYSQL中

3 个答案:

答案 0 :(得分:1)

另一个变种:

$text2= "T. Toth, M. A. Carlo de Miller, T. Stallone";
$result = array();
foreach (explode(",",$text2) as $row)
{
  $row = explode(".",$row);
  $last = array_pop($row);
  $result[] = join(".",$row).".";
  $result[] = $last;
}
print_r($result);

结果:

Array ( [0] => T. [1] => Toth [2] => M. A. [3] => Carlo de Miller [4] => T. [5] => Stallone )

答案 1 :(得分:0)

preg_split可能不是正确的功能。请使用preg_match_all

尝试此操作
$text2= "T. Toth, M. A. Carlo de Miller, T. Stallone";
preg_match_all("/\w{2,}(?:\s\w{2,})*|\w\.(?:\s\w\.)*/i", $text2, $matches);
print_r($matches[0]);

这会选出名称和缩写,同时省略前导/尾随空格。

首先匹配整个名称:\w{2,}(?:\s\w{2,})*

第二场比赛首字母:\w\.(?:\s\w\.)*

结果:

Array ( [0] => Array ( [0] => T. [1] => Toth [2] => M. A. [3] => Carlo de Miller [4] => T. [5] => Stallone ) )

答案 2 :(得分:0)

我认为这个正则表达式应该或多或少地做你想要的:

/
  (?:^|,)           # Start of subject or comma
  \s*               # Optional white space
  ((?:[a-z]\.\s*)+) # At least one occurrence of alpha followed by dot
  \s*               # Consume trailing whitespace
/ix

当与PREG_SPLIT_NO_EMPTYPREG_SPLIT_DELIM_CAPTURE捕获标志结合使用时,此表达式将获得您想要的结果,唯一需要注意的是它还将捕获一些前导/尾随空格。我无法看到避免这种情况的方法,并且在使用结果时可以轻松修剪它。

$str = 'T. Toth, M. A. Carlo de Miller, T. Stallone';
$expr = '/(?:^|,)\s*((?:[a-z]\.\s*)+)\s*/i';
$flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE;

$keywords = preg_split($expr, $str, -1, $flags);

print_r($keywords);

See it working