Регулярное выражение соответствует значению долготы, которое больше 18 цифр - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу сопоставить значение долготы: -3.6503552000000004, используя preg_match('/^([+\-])?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$/', $value), но, похоже, мое регулярное выражение не может проверить, если за точкой больше 15 цифр.

Вот тест, который я прошел, который прошел:

<?php

namespace Tests\Unit\Rules;

use App\Rules\LongitudeRule;
use Tests\TestCase;

class LongitudeRuleTest extends TestCase
{
    /** @test */
    public function pass_when_value_between_min_180_to_plus_180()
    {
        $this->assertTrue((new LongitudeRule)->passes('longitude', '-180'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '+180'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '-45'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '+45'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '0'));
    }

    /** @test */
    public function pass_when_value_between_min_180_to_plus_180_and_float()
    {
        $this->assertTrue((new LongitudeRule)->passes('longitude', '-180.0'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '+180.0'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '-45.1'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '+45.1'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '0.0'));
    }

    /** @test */
    public function pass_when_value_between_min_180_to_plus_180_and_no_plus_assigned()
    {
        $this->assertTrue((new LongitudeRule)->passes('longitude', '-180'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '180.0'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '-45.1'));
        $this->assertTrue((new LongitudeRule)->passes('longitude', '45'));
    }

    /** @test */
    public function failed_when_value_has_using_comma()
    {
        $this->assertFalse((new LongitudeRule)->passes('longitude', '45,1'));
        $this->assertFalse((new LongitudeRule)->passes('longitude', '-45,1'));
    }

    /** @test */
    public function failed_when_value_is_wrong()
    {
        $this->assertFalse((new LongitudeRule)->passes('longitude', 'A'));
    }
}

Я новичок в regex, извините! Итак ... Я хочу сказать спасибо, если кто-то может помочь? ?

1 Ответ

0 голосов
/ 29 апреля 2020

(?:\.[0-9]{1,6})? не может соответствовать 15 цифрам, так как может соответствовать только 1-6 цифрам после точки. Итак .. нужно увеличить лимит (?:\.[0-9]{1,16})? или снять лимит (?:\.[0-9]+)?

Спасибо @ WiktorStribiżew @ Rokas

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