用不同的分隔符拆分php中的字符串

时间:2018-01-23 10:41:16

标签: php regex

这是字符串:Doe,John Michael A
但我的数据库有3列,即: first_name, last_name and middle_initial

如何拆分名称以便输出:

last_name = 'Doe'
first_name = 'John Michael'
middle_initial = 'A.'

4 个答案:

答案 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