Помогите с РНР (вырезать участок строки по шаблону)

Asar
На сайте с 23.08.2004
Offline
334
638

Есть набор строк.

В каждой из них может быть или может не быть дата в формате "November 18, 2004", т.е. название месяца на английском, пробел, число, запятая с пробелом, год.

Перебирая строки, пытаюсь из них удалить все прочее, кроме этих дат. Месяц и число могут быть любыми, год — с 2000 до 2012.

Пытаться-то пытаюсь, но нифига не выходит. Не рожается шаблон для поиска/обрезки. Разве что искать любой из месяцев, и после него резать посимвольно.

Скажите, есть какое-нить решение для этого дела?

siv1987
На сайте с 02.04.2009
Offline
427
#1

Хз если сработает но

(?:.*?(\w+\s\d{1,2},\d{4}))+

\1

Идея думаю понятна

siv1987
На сайте с 02.04.2009
Offline
427
#2

а если набор строк и на PHP то

'/.*?(\w+\s\d{1,2},\d{4}).*/', '$1'

Joker-jar
На сайте с 26.08.2010
Offline
171
#3

При подобном вопросе хорошим бы тоном было предоставление примера набора строк, чтобы было, на чем тестировать. Такой вариант будет работать?

<?php

$text =<<<END
bla bla November 18, 2011
bla March 1, 2010 bla bla
bla bla April bla bla
November 11, 2001
bla bla bla bla June 28, 2009
bla bla bla 23, 2009 bla bla
Month 40, 2010
END;

$return = array();

function callback($matches)
{
global $return;

$info = cal_info(0);
$months = $info['months'];

$month = $matches[1];
$day = intval($matches[2]);
$year = intval($matches[3]);

if ( ! in_array($month, $months) ) return $matches[0];
if ( $day < 0 || $day > 31 ) return $matches[0];
if ( $year < 2000 || $year > 2012 ) return $matches[0];

$return[] = $matches[0];

return $matches[0];
}

preg_replace_callback('/([a-z]+) ([0-9]{1,2}), ([0-9]{4})/i', 'callback', $text);

print_r($return);

?>
S7
На сайте с 15.08.2010
Offline
79
#4
Asar:
пытаюсь из них удалить все прочее, кроме этих дат

т.е. выбрать из текста все даты

Asar:
в формате "November 18, 2004"

используйте для строк preg_match_all.. к примеру:

$string = file_get_contents('абсолютный-путь-к-файлу-с-текстом');

if (preg_match_all("~((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[^\s]*\s+[0-9]{1,2},\s+20[0-1][0-9])~is", $string, $match)) {

print_r($match);

}

результатом в $match будет подобный массив:

Array

(

[0] => Array

(

[0] => Jan. 05, 2001

[1] => February 7, 2011

[2] => March 15, 2007

...

[11] => December 5, 2012

[12] => Dec. 5, 2012

)

[1] => Array

(

[0] => Jan

[1] => Feb

[2] => Mar

...

[11] => Dec

[12] => Dec

)

)

Успеха! :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий