Попогите вырезать код из даты и диапазона дат

Тема в разделе "Регулярные выражения", создана пользователем killoff, 5 ноя 2016.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.392
    Симпатии:
    923
    Приветствую всех. Уже больше недели пытался нагуглить как это реализовать, но что то не могу найти нормальной рабочей регулярки на php. В общем нужна регулярка чтобы удалить все, кроме годов в числах, числа могут быть таких форматов:
    Код:
    30.08.2016
    1.10.2015
    30.08.2016 - 1.10.2015
    1 января 2012
    1 января 2012 года
    
     
  2. Sorcus

    Sorcus Sorcus. A New Beginning.

    Moderator
    Регистр.:
    10 июл 2011
    Сообщения:
    421
    Симпатии:
    773
    TrueStory и killoff нравится это.
  3. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.392
    Симпатии:
    923
    Как я только ни пробовал добавить в код, у меня ничего не получилось :facepalm:
    PHP:
    foreach($xfields as $value){  // перебор значений массива
        
    if($value[xfields]){ //проверяем есть ли элемент в массиве
       
            
    $row xfieldsdataload($value[xfields]); //получаем нужное нам доп поле
            
    if($row[$xfield]){ //проверяем есть ли значение
               
                
    $rowdata explode","$row[$xfield]); //разбиваем наше значение на массив
                
    foreach($rowdata as $value){    //перебираем значения массива
                    
    if($value){                    //проверяем есть ли значение
                        
    $value trim($value);    //убираем пробелы
                        
    array_push($stack$value); //добавляем в конец массива полученное значение
                        
    }
                    }
                }
            }
        }
    пытался ставить и после и перед "удалением пробелов" в значениях, но всё было безуспешно. Уже не вспомню что именно писал, но пробовал несколько вариантов что нагуглил в начале месяца.
     
  4. Sorcus

    Sorcus Sorcus. A New Beginning.

    Moderator
    Регистр.:
    10 июл 2011
    Сообщения:
    421
    Симпатии:
    773
    Так что-ли?
    date.list
    Код:
    30.08.2016
    1.10.2015
    30.08.2016 - 1.10.2015
    1 января 2012
    1 января 2012 года
    init.rb
    Код:
    years_list = File.open('./date.list', 'r')
    
    years = Array.new
    
    years_list.each_line do |line|
        line.strip.split.each do |year|
            years << year.gsub!(/.*([\d]{4}).*/, '\1')
        end
    end
    
    puts years.compact
    output
    Код:
    laptop% ruby -w init.rb
    2016
    2015
    2016
    2015
    2012
    2012
    Хотя лучше вот так. Тогда все года вытаскивает.
    Код:
    years_list = File.open('./date.list', 'r')
    
    years = Array.new
    
    years_list.each_line do |line|
        years << line.scan(/[0-9]{4}/)
    end
    
    puts years
    Код:
    laptop% ruby -w init.rb
    2016
    2015
    2016
    2015
    2012
    2012
    P.S. Первый вариант тоже вытаскивает, но этот короче и понятнее.
     
    Последнее редактирование модератором: 27 ноя 2016
  5. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.392
    Симпатии:
    923
    и как это прикрутить к коду выше?
    Пробовал через
    PHP:
    $result preg_match('/[0-9]{4}/',$value,$found);
    добавлял его после
    PHP:
    $value trim($value);
    и потом собирал $result в массив $stack. В результате у меня кажется выводилось только пару значений каких то никаким образом не похожих на года четырехзначные :confused:
     
  6. Sorcus

    Sorcus Sorcus. A New Beginning.

    Moderator
    Регистр.:
    10 июл 2011
    Сообщения:
    421
    Симпатии:
    773
    Откуда я знаю, я не php кодер :D
    Я лишь привел пример на ruby, который делает то, что тебе по идее нужно. А дальше уже сам по аналогии на php себе собирай :crazy:
     
    killoff нравится это.
  7. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    245
    Симпатии:
    321
    http://php.net/manual/ru/function.preg-match.php
    Cовпавшая часть строки будет в $found[0], а не в $result.

    PHP:
                $rowdata explode","$row[$xfield]); //разбиваем наше значение на массив
                
    foreach($rowdata as $value){    //перебираем значения массива
                    
    if($value){                    //проверяем есть ли значение
                        
    $value trim($value);    //убираем пробелы
                        
    array_push($stack$value); //добавляем в конец массива полученное значение
                        
    }
                    }
    Заменить на
    PHP:
                preg_match_all('/[0-9]{4}/'$row[$xfield], $matches);
                
    $stack array_merge($stack$matches[0]);
     
    Последнее редактирование: 1 дек 2016
    killoff нравится это.
  8. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    252
Статус темы:
Закрыта.