我有一个简单的字符串,其中应包含姓名和出生日期,如下所示:
$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'>=></font> <small>string</small>
<font color='#cc0000'>'bob smithers '</font>
<i>(length=13)</i>
1 <font color='#888a85'>=></font> <small>string</small>
<font color='#cc0000'>''</font>
<i>(length=0)</i>
我需要的是将字符串分成两部分 - 一部分包含日期,另一部分包含名称
答案 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]);
}
答案 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
)
答案 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);