php使用日期格式拆分字符串

时间:2013-12-20 10:25:27

标签: php preg-match str-replace preg-split

我有一个简单的字符串,其中应包含姓名和出生日期,如下所示:

$searchParams = '12/12/1978 Bob Smithers';

或者

$searchParams = 'Bob Smithers 12/12/1978';

如果字符串中存在日期,我需要做的是将日期与名称分开。我可以通过下面的代码获取日期,但如果按照上面第一个例子中的顺序抛出一些怪癖。

$splitData=preg_split('/([0-9]{1,2})-([0-9]{1,2})-([0-9]{2,4})$/', $searchParams);

第二个示例返回一个数组:

<pre class='xdebug-var-dump' dir='ltr'>
<b>array</b>
<i>(size=2)</i>
0 <font color='#888a85'>=&gt;</font> <small>string</small>
<font color='#cc0000'>'bob smithers '</font>
<i>(length=13)</i>
1 <font color='#888a85'>=&gt;</font> <small>string</small>
<font color='#cc0000'>''</font>
<i>(length=0)</i>

我需要的是将字符串分成两部分 - 一部分包含日期,另一部分包含名称

5 个答案:

答案 0 :(得分:1)

您可以使用这个简单的函数,它将返回数组中的日期,以及字符串的其余部分:

function strip_name_and_date($searchParams) {
    $pattern = '~\d{2}/\d{2}/\d{4}~';
    preg_match_all($pattern, $searchParams, $matches);
    $name = trim(preg_replace($pattern, '', $searchParams));
    return array('name' => $name, 'dates' => $matches[0]);
}

demo

答案 1 :(得分:1)

preg_split允许第四个参数为flags

$searchParams = 'Bob Smithers 12-12-1978';

$splitData=preg_split('/\s*([0-9]{1,2}-[0-9]{1,2}-[0-9]{2,4})\s*/', $searchParams, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

var_dump($splitData);

答案 2 :(得分:1)

您可以使用捕获组来提取日期,然后使用名称后跟它。很难写出一个完美的正则表达式来说明所有可能的日期,包括闰年。最好使用PHP的strtotime()进行验证:

$pieces = array();    
$searchParams = '12/12/1978 Bob Smithers';
if (preg_match('~(\d{2}/\d{2}/\d{4})\s+(.*)~', $searchParams, $matches)) {
    if (strtotime($matches[1])) {
        $pieces = array($matches[1], $matches[2]);
    }
}

print_r($pieces);

输出:

Array
(
    [0] => 12/12/1978
    [1] => Bob Smithers
)

Demo.

答案 3 :(得分:0)

regex 免费解决方案 [适用于两种情况]

<?php
$searchParams = 'Bob Smithers 12/12/1978';
$val=explode(' ',$searchParams);
if(strpos($val[0],'/')!==false)
{
//echo "true";
$date = array_shift($val);
$name= implode(' ',$val);
echo $name.",".$date;
}
else
{
$date = array_pop($val);
$name= implode(' ',$val);
echo $name.",".$date;
}

答案 4 :(得分:0)

我能想到的最简单的解决方案:

$str='12/12/1978 Bob Smithers';
$ar=array();
$regex="(?:\d\d?[\/-]){2}\d{2,4}";
preg_match("/".$regex."/",$str,$ar);
array_push($ar,preg_replace("/\s*".$regex."\s*/","",$str));
var_dump($ar);