通过姓氏和首字母分隔姓名
Separation of the name by the surname and initials
有一个名字和首字母的列表,用逗号分隔并存储在一个名为 $author
的变量中
Shevchuk T.I., Piskun R.P., Vasenko T.B.
需要将姓名首字母和姓氏分别分开成变量。
姓名示例:
Belemets N.I. / 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.
提前致谢!
更新:
现在代码如下所示:
$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";
}
您的实施存在一些问题。 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://github.com/knmnyn/ParsCit。您可能可以提取逻辑来解析作者。
surname
使用 3,15
检查也不是在所有情况下都有效。例如https://www.ncbi.nlm.nih.gov/pubmed/29052443,Hong Yu
不会被匹配,因为姓氏只有2个字符。
有一个名字和首字母的列表,用逗号分隔并存储在一个名为 $author
Shevchuk T.I., Piskun R.P., Vasenko T.B.
需要将姓名首字母和姓氏分别分开成变量。
姓名示例:
Belemets N.I. / 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.
提前致谢!
更新:
现在代码如下所示:
$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";
}
您的实施存在一些问题。 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://github.com/knmnyn/ParsCit。您可能可以提取逻辑来解析作者。
surname
使用 3,15
检查也不是在所有情况下都有效。例如https://www.ncbi.nlm.nih.gov/pubmed/29052443,Hong Yu
不会被匹配,因为姓氏只有2个字符。