通过姓氏和姓名首字母分隔姓名

时间:2017-11-16 16:43:05

标签: php regex preg-split

有一个名称和首字母的列表,用逗号分隔并存储在名为$author

的变量中
  

Shevchuk T.I.,Piskun R.P.,Vasenko T.B。

有必要将首字母和姓氏分别分成变量。

名称示例:

  

Belemets N.I. / 你。 Belemets / N. I. Belemets / Belemets N. I. / Belemets N. / N. Belemets / Nu。 Belemets / Belemets Nu。

现在我尝试按以下方式执行此操作:

$str_arr1= explode(", ", $author);
$initials= preg_split('([A-Z]\.[A-Z]\.|[A-Z]\.\s+[A-Z]\.|[A-Z][a-z]\.)', $str_arr1);
$surnames= preg_split('\w{3,15}', $str_arr1);

print_r($ str_arr1)的示例:

Array
(
    [0] => Gunas I. V.
    [1] => Babych L. V.
    [2] => Cherkasov E. V.
)

$initials$surnames不会输出任何内容。可能是什么问题呢? CMS MODX。

提前致谢!

UPD:

现在代码如下所示:

$str_arr= explode(", ", $author);
foreach($str_arr as $value){
    $preinitial= preg_split('/([A-Z]\.[A-Z]\.|[A-Z]\.\s+[A-Z]\.|[A-Z][a-z]\.\s+[A-Z]\.|[A-Z][a-z]\.)/', $value, -1, PREG_SPLIT_NO_EMPTY);
    $presurname= preg_split('/\w{3,15}/', $value, -1, PREG_SPLIT_NO_EMPTY);
    $initial = implode("", $preinitial);
    $surname = implode("", $presurname);
    echo '<given_name>'.$surname.'</given_name>';
    echo '<surname>'.$initial.'</surname>';
    echo "\r\n";
}

1 个答案:

答案 0 :(得分:2)

您的实施存在一些问题。 preg_split不接受数组,并且需要分隔符。您还应该使用PREG_SPLIT_NO_EMPTY,这样您就无法获得空值。您的变量名称也会被反转,split会删除匹配的内容,因此$initials实际上是姓氏,而$surnames实际上是姓名缩写。

$author = 'Shevchuk T.I., Piskun R.P., Vasenko T.B.';
$str_arr1= explode(", ", $author);
foreach($str_arr1 as $str_arr) {
    $initials= preg_split('/([A-Z]\.[A-Z]\.|[A-Z]\.\s+[A-Z]\.|[A-Z][a-z]\.)/', $str_arr, -1, PREG_SPLIT_NO_EMPTY);
    $surnames= preg_split('/\w{3,15}/', $str_arr, -1, PREG_SPLIT_NO_EMPTY);
    print_r($initials);
    print_r($surnames);
}

演示:https://3v4l.org/1sgmX

我推荐这个我已经成功使用的库来解析完整的引用,https://github.com/knmnyn/ParsCit。你可以拉出逻辑来解析作者。

surname3,15的{​​{1}}检查在所有情况下都不会起作用。例如,https://www.ncbi.nlm.nih.gov/pubmed/29052443Hong Yu不匹配,因为姓氏只有2个字符。