这是字符串:Doe,John Michael A
但我的数据库有3列,即:
first_name, last_name and middle_initial
如何拆分名称以便输出:
last_name = 'Doe'
first_name = 'John Michael'
middle_initial = 'A.'
答案 0 :(得分:1)
您可以使用preg_split方法添加多个分隔符,例如:
$str = "Doe, John Michael A."
$pieces = preg_split('/[, ]/', $str);
var_dump($pieces);
<强>输出强>
array(6) {
[0]=>
string(1) "Doe"
[1]=>
string(1) "John"
[2]=>
string(1) "Michael"
[3]=>
string(1) "A."
}
所以:
last_name = $pieces[0]
first_name = $pieces[1] + $pieces[2]
middle_initial = $pieces[3]
答案 1 :(得分:0)
您可以使用带有PCRE(Perl兼容正则表达式)的preg_split作为第一个参数,它允许您执行以下操作:
1a, 2a, 3a, 100b, 101c
将创建以下输出:
<?php
$str = "Doe, John Michael A.";
$parts = preg_split('/,\s*|\s(?=\S+$)/', $str);
var_dump($parts);
<强>解释强>
正则表达式将拆分为任何array(3) {
[0]=>
string(3) "Doe"
[1]=>
string(12) "John Michael"
[2]=>
string(2) "A."
}
个字符,后跟零个或多个空格字符(,
)以及任何空格(\s*
),后面只有非空格字符(\s
)直到字符串结尾(\S+
)。
$
部分是所谓的前瞻,不会作为分隔符的一部分被删除。
答案 2 :(得分:0)
一个简单的正则表达式可以是
$re = '/(.*), (.*) ([^\s\.].*)/';
它的用法是
$re = '/(.*), (.*) ([^\s\.].*)/';
$str = 'Doe, John Michael A.';
preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
//Print the entire match result
var_dump($matches);
输出
完全匹配0-20
Doe, John Michael A.
组1. 0-3
Doe
第2组.5-17
John Michael
第3组.18-20
A.
see working example from regex101
将其分解
(.*), captures everything until the comma
(.*) captures anything between the first group and the last group giving the firstname
([^\s\.].*) captures all( that doesn't have space in it) after the last space.
notice the space character before the group.
答案 3 :(得分:-1)
如果您可以更改输入字符串(Doe,John Michael A.)以遵循类似(Doe,John Michael,A。)的模式,那么您可以使用explode函数:
$parts = explode(',','Doe, John Michael, A.');
您可以按如下方式访问每个部分:
echo $parts[0]; //=>Doe
echo $parts[1]; //=> John Michael
echo $parts[2]; //=> A.
请注意,您可以在最后两个部分之前获取空格以删除它:
echo substr($parts[1], 1); //=>John Michael
但是,如果你不能触摸原来的字符串,如果你确定最初的字符串总是2个字符,你可以这样做:
$parts = explode(',','Doe, John Michael A.');
echo $parts[0]; //=>Doe
$init = substr($parts[1], 2); //=> A.
$name = str_replace($init, "", $parts[1]); //=> John Michael
$name = substr($name, 1); // to remove the first space