Какое выражение регулярного выражения будет проверять значения GPS? - PullRequest
6 голосов
/ 19 августа 2011

Я позволяю пользователям вводить значения GPS через форму, все они имеют одинаковую форму, некоторые примеры:

49.082243,19.302628  

48.234142,19.200423  

49.002524,19.312578

Я хочу проверить введенное значение, используя PHP (используя preg_match(), я полагаю), но, поскольку я не очень хорош в выражениях регулярных выражений (о, тупой, я должен наконец-то его изучить, я знаю) не знаю, как написать выражение.

Очевидно, это должно быть:
2x (цифры), 1x (точка), 6x (цифры), 1x (запятая), 2x (цифры), 1x (точка), 6x (цифры)

Есть предложения, как написать это в регулярном выражении?

Ответы [ 5 ]

13 голосов
/ 19 августа 2011

Другие ответы, которые я вижу, не принимают во внимание, что долгота изменяется от -180 до 180, а широта - от -90 до 90.

Правильное регулярное выражение для этого будет (при условии, что порядок "широта, долгота "):

/^(-?[1-8]?\d(?:\.\d{1,6})?|90(?:\.0{1,6})?),(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,6})?|180(?:\.0{1,6})?)$/

Это регулярное выражение охватывает не менее -90 и не более 90 для широты, а также не менее -180 и не более 180 для долготы, позволяя имставьте целые числа, а также любое количество десятичных разрядов от 1 до 6, если вы хотите повысить точность, просто измените {1,6} на {1, x}, где x - это число десятичных разрядов

Кроме того, если вы захватываете группу 1, вы получаете широту, а захват группы 2 получает долготу.

11 голосов
/ 19 августа 2011

Что-то вроде:

/^(-?\d{1,2}\.\d{6}),(-?\d{1,2}\.\d{6})$/
  • ^ якоря в начале ввода
  • -? допускает, но не требует отрицательный знак
  • \d{1,2} требуется 1 или 2 десятичных знака
  • \. требуется десятичная точка
  • \d{6} требуется ровно 6 десятичных цифр
  • , соответствует одной запятой
  • (повторите первые 5 пуль)
  • $ якоря в конце ввода

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

Общая полезная ссылка на регулярное выражение: http://www.regular -expressions.info / reference.html

1 голос
/ 19 августа 2011

Расширение на другой ответ:

/^-?\d\d?\.\d+,-?\d\d?\.\d+$/
1 голос
/ 19 августа 2011
/$-?\d{2}\.\d{6},-?\d{2}\.\d{6}^/
0 голосов
/ 19 августа 2011

На основе вашего примера это будет сделано:

if (preg_match('/(-?[\d]{2}\.[\d]{6},?){2}/', $coords)) {
    # Successful match
} else {
    # Match attempt failed
}

Пояснение:

(          # Match the regular expression below and capture its match into backreference number 1
-          # Match the character “-” literally
?          # Between zero and one times, as many times as possible, giving back as needed (greedy)
[\d]       # Match a single digit 0..9
{2}        # Exactly 2 times
\.         # Match the character “.” literally
[\d]       # Match a single digit 0..9
{6}        # Exactly 6 times
,          # Match the character “,” literally
?          # Between zero and one times, as many times as possible, giving back as needed (greedy)
){2}       # Exactly 2 times
...