За последние 24 часа нас посетили 17138 программистов и 1835 роботов. Сейчас ищет 1621 программист ...

Помогите с выражением для определения вида строки и её разбиения

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

  1. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    Дано:
    есть географическая координата, представленная строкой, которая может быть записана в нескольких различных видах.
    Это
    1. градусы минуты секунды.десятичные (ddd mm ss.ss)
    2. градусы минуты.десятичные (ddd mm.mmmm)
    3. градусы.десятичные (ddd.dddd)
    4. всё остальное, не попадающее под предыдущее, не обрабатывать.

    Совместно с пробелом разделителем может быть ещё символ, то есть разделителями являются 1-2 нецифровых знака.
    Дробная часть необязательна, сами значения занимают 1-3 знака (градусы), 1-2 знака (целая часть минт и секунд) и от 0 знаков дробная часть.
    После последних величин также может быть несколько ненужных нецифровых символов.

    Мне надо привести первые 3 варианта написания к одному, то есть выделить отдельно dd, mm, ss, а для этого надо определить, в каком виде записано

    Пробую сделать так:

    Код (Text):
    1. $dd = $mm = $ss = 0;
    2.     $form='/\d+\.?\d*/';
    3.     if (preg_match_all($form, $input, $match) > 0 ) //если ddd.ddddd
    4.     {
    5.         preg_match_all($form, $input, $match);
    6.     }
    7.  
    8.     $form='/(\d+\D?+)+?/';
    9.     if (preg_match_all($form, $input, $match) > 0 ) //если ddd mm ss.ss
    10.     {
    11.         preg_match_all($form, $input, $match);
    12.     }
    Оно срабатывает оба раза, так как находит число и успокаивается, и я слабо понимаю, что делать, так как регулярки до меня не доходят :(
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    preg_replace? или | в регулярных?
     
  3. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    Так всё равно даже в preg_replace надо применять шаблоны для определения, в каком виде запись чтобы сделать дальнейшую обработку. А это у меня и не получается. То, что пытаюсь сделать, срабатывает во всех случаях.

    Я проверяю, если запись вида стандартных координат, то разбиваю на градусы, минуты, секунды и вычисляю представление в вид "градусы с дробной частью". Если запись вида "градусы дробные минуты", то также разбиваю на части и произвожу вычисления. Если только в виде дробных градусов, то только отбрасываю все не числа, чтобы можно было дальше работать.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    В каком смысле? Два if отрабатывают?
     
  5. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    Оба if отрабатывает.

    Вообще, что-то странное произошло, оно сейчас стало работать с $form='/\d+\.?\d*/' так, как меня устраивает, выделяя все части координаты. До этого выбирало почему-то только первое число.

    Тему можно закрыть, всё равно я дуро, не понимаю, как и почему заработало. :D
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Если нужно чтобы один, то есть elseif
     
    Unicorn нравится это.
  7. Unicorn

    Unicorn Новичок

    С нами с:
    13 дек 2013
    Сообщения:
    20
    Симпатии:
    0
    Я же говорю - дуро :) Даже в голову не пришёл такой вариант. Сспасибо.