2013-12-20 22 views
0

У меня есть простая строка, которая должна содержать имя и дату рождения, как показано ниже:PHP разделить строку, используя формат даты

$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> 

Что я требую, чтобы разбить строку на две части - одна, содержащая дату и один, содержащий имя

+0

preg_split будет использовать regexp как разделитель, по которому будет разделяться строка, т. е. она не будет возвращена. Попробуйте preg_match_all, чтобы получить дату, а затем удалите ее из исходной строки, если она найдена –

ответ

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; 
} 
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

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); 
1

Вы можете использовать группы захвата, чтобы извлечь дату, а затем имя, за которым следует его. Трудно написать идеальное регулярное выражение для учета всех возможных дат, включая високосные годы. Это лучше использовать РНР 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.

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); 
Смежные вопросы