【问题标题】:Separation of the name by the surname and initials姓名由姓氏和首字母分开
【发布时间】:2017-11-16 16:43:04
【问题描述】:

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

Shevchuk T.I.、Piskun R.P.、Vasenko T.B.

需要将首字母和姓氏分别分隔成变量。

名称示例:

贝莱美 N.I. / 你。 Belemets / N. I. Belemets / Belemets N. I. / Belemets N. / N. Belemets / Nu.贝莱美 / 贝莱美 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";
}

【问题讨论】:

  • $str_arr1 分配中有一个尾随空格。您的逗号分隔列表是否使用", "","
  • 没有错,我就是这样把逗号后面多余的空格去掉的。
  • 预期输出是什么?
  • 预期:$surnames = Gunas,$initials = I. V.

标签: php regex preg-split


【解决方案1】:

您的实施存在一些问题。 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 的检查也不适用于所有情况。例如https://www.ncbi.nlm.nih.gov/pubmed/29052443Hong Yu 将不匹配,因为姓氏只有 2 个字符。

【讨论】:

  • 就在那儿,代码开始工作了,但由于某种原因,在姓名缩写之前和姓氏之后有一个空格 H. A.Oksak A.L.Borkunov 。我使用 implode co 将数组转换为字符串,例如 $initial = implode("", $preinitial);。如何删除空格?
  • 您可以在分配上使用 trim,或者将\h* 添加到两者中,这样空格也会被拆分。你能展示一下你是如何使用它的吗?
  • 也给正则表达式一些空格,并且应该按预期工作。 3v4l.org/hjQHC 与名称一起留下的空白也是如此。或者,您可以只使用 trim 3v4l.org/qZVdq (也许将来的开发人员更容易阅读?)。
猜你喜欢
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多