简体   繁体   English

正则表达式匹配超过 18 位的经度值

[英]Regex match longitude value that more than 18 digit

I want to match longitude value: -3.6503552000000004 using preg_match('/^([+\-])?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$/', $value) but seems my regex can't validate if more than 15 digits behind the dot.我想匹配经度值: -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 位。

Here the test I did that passed:这里我做的测试通过了:

<?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'));
    }
}

I'm new at regex sorry.我是正则表达式的新手,抱歉。 So.?所以。? I do want to say thanks if someone can help?如果有人可以提供帮助,我想说声谢谢?

(?:\.[0-9]{1,6})? can't match 15 digits as it can only match 1 through 6 digits after a dot.无法匹配 15 位数字,因为它只能匹配点后的 1 到 6 位数字。 So.. need to increase the limit (?:\.[0-9]{1,16})?所以..需要增加限制(?:\.[0-9]{1,16})? or remove the limit (?:\.[0-9]+)?或删除限制(?:\.[0-9]+)?

Thank you @WiktorStribiżew @Rokas谢谢@WiktorStribiżew @Rokas

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM