Регулярное выражение для получения даты от строки - PullRequest
2 голосов
/ 22 января 2012

Я пытаюсь получить часть строки, которая представляет дату.

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 22 января 2012

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

/(?: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_*.

1 голос
/ 22 января 2012

Вместо того, чтобы полагаться на устаревший 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].

1 голос
/ 22 января 2012

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

$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 уже давно считается более быстрой и широко используемой альтернативой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...