2012-01-21 3 views
2

Я пытаюсь захватить часть строки, которая представляет дату.Regex to grab Date from String

Строка даты обычно, но не всегда, имеет регулярный текст до и/или после него.

В этом примере:

Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here 

Я хотел бы, чтобы результат:

Sun, Apr 09, 2000 

Имейте в виду, что дни и месяц строки могут быть 3 или 4-х символов в длину.

Моей скудная попытка:

$test = "Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here"; 

if (ereg ("/([a-z]{3,4}),.([a-z]{3,4}).([0-9]{1,2}),.([0-9]{4})/i", $test, $regs)) { 
    echo "$regs[4].$regs[3].$regs[2].$regs[1]"; 
} 

Также интересно услышать решения, основанные без регулярных выражений.

ответ

1

Это регулярное выражение, кажется, работает в нескольких случаях:

$str = "Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here"; 
$reg = '/(\w{3}),\s*(\w{3})\s*(\d+),\s*(\d{4})/'; 

$match = preg_match($reg, $str, $matches); 

if ($match) { 
    $date = "{$matches[2]} {$matches[3]} {$matches[4]}\n"; 
    // Apr 09 2000 
    $timestamp = strtotime($date); 
} 

ereg() больше не должны быть использованы как в PHP 5.3.0 он является устаревшим и PREG уже давно выступает как более быстрый, более широко используется альтернатива ,

1

Вместо того, чтобы полагаться на устаревшие ereg, попробуйте preg_match_all.

$str = "Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here"; 

preg_match_all('/.*([A-Za-z]{3,4}, [A-Za-z]{3,4} [\d]{1,2}, [\d]{4}).*/',$str,$matches); 

Выход

(
    [0] => Array 
     (
      [0] => Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here 
     ) 

    [1] => Array 
     (
      [0] => Sun, Apr 09, 2000 
     ) 

) 

Вы найдете все матчи в $matches[1].

2

Кто-то мог бы, вероятно, лучше, чем это, как это довольно многословен:

/(?:mon|tues?|weds|thurs?|fri|sat|sun), [a-z]{3,4} [0-9]{1,2}, [0-9]{4}/i 

$regex = '/(?:mon|tues?|weds|thurs?|fri|sat|sun), [a-z]{3,4} [0-9]{1,2}, [0-9]{4}/i'; 
$string = 'Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here'; 

preg_match($regex, $string, $matches); 

echo $matches[0]; 
// Sun, Apr 09, 2000 

Если вы ожидаете дату произойти несколько раз, незначительное изменение помогает.

// store the match as a named parameter called 'date' 
$regex = '/(?<date>(?:sun|mon|tues?|weds|thurs?|fri|sat|sun), [a-z]{3,4} [0-9]{1,2}, [0-9]{4})/i'; 

$string = 'Sometimes text is here, Sun, Apr 09, 2000 And sometimes but not always text here. Sun, Mar 10, 2010'; 

preg_match_all($regex, $string, $matches); 

print_r($matches['date']); 
/* 
Array 
    (
     [0] => Sun, Apr 09, 2000 
     [1] => Sun, Mar 10, 2010 
    ) 
*/ 

начал с названием дня, просто на всякий случай, вы получите то, что выглядит так же, как день, но это не так.

Я также не предлагаю использовать ereg(), так как он устарел в 5.3.0. Вместо этого используйте preg_match() или одну из других функций preg_*.