【问题标题】:Regexp for validating simple pattern用于验证简单模式的正则表达式
【发布时间】:2013-11-16 08:39:23
【问题描述】:

我正在尝试创建将验证简单模式的正则表达式。这里是有效和无效模式的列表。

有效:

foo, foo.bar, foo.bar.baz,
*, *.foo, foo.*, *.foo.*, *.foo.bar, foo.*.bar, foo.bar.*, *.foo.bar.*,
**, **.foo, foo.**, **.foo.**, **.foo.bar, foo.**.bar, foo.bar.**, **.foo.bar.**

而且无效:

<empty string>, null, false, true, foo bar baz,
.foo, foo., .foo.,
***, ***.foo, foo.***, ***.foo.*, foo.***.bar

所以允许的标记是***。 我花了很多时间尝试为这些模式编写正则表达式,最好的解决方案是:

/(\.|^)(\w+|\*{1,2})(?=\.|$)/

但它不会检查整个模式,只是找到它的一部分,所以我无法使用preg_match 进行验证。另一个问题是.foo 模式根据该正则表达式是有效的,但它不应该因为开头的点。

我错过了什么?

【问题讨论】:

    标签: php regex validation preg-match match


    【解决方案1】:

    使用这个正则表达式:

    /^(\*{1,2}|[a-z]+)(\.(\*{1,2}|[a-z]+))*$/i
    

    这里是通过验证所有“好”模式匹配而不是“坏”模式来测试它的示例代码。它正确处理了您提供的每一个示例。

    $good_data = array(
        'foo',
        'foo.bar',
        'foo.bar.baz',
        '*',
        '*.foo',
        'foo.*',
        '*.foo.*',
        '*.foo.bar',
        'foo.*.bar',
        'foo.bar.*',
        '*.foo.bar.*',
        '**',
        '**.foo',
        'foo.**',
        '**.foo.**',
        '**.foo.bar',
        'foo.**.bar',
        'foo.bar.**',
        '**.foo.bar.**'
        );
    $bad_data = array(
        '',
        null,
        false,
        true,
        'foo bar baz',
        '.foo',
        'foo.',
        '.foo.',
        '***',
        '***.foo',
        'foo.***',
        '***.foo.*',
        'foo.***.bar'
        );
    $regex = "/^(\*{1,2}|[a-z]+)(\.(\*{1,2}|[a-z]+))*$/i";
    foreach($good_data as $data) {
        echo (preg_match($regex, $data) ? "pass" : "FAIL: $data")."<br/>";
    }
    foreach($bad_data as $data) {
        echo (!preg_match($regex, $data) ? "pass" : "FAIL: $data")."<br/>";
    }
    

    【讨论】:

    • 这正是我要找的!非常感谢!
    【解决方案2】:

    你可以使用这个正则表达式:

    /^(?!(null|true|false|)$)(\*{1,2}\.?)?(\w+(\.\w+)*(\.?\*{1,2})?)?$/
    

    【讨论】:

    • 它在foo.*.bar 上在foo.**.bar 上失败,但匹配*foofoo*
    【解决方案3】:

    如果您特别想将foobar 和/或baz(全部可选)作为有效选项,这里还有一个选项:

    /((\*+|(foo|bar|baz)+)(\.(\*+|(foo|bar|baz)+))*)/
    

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2014-04-27
      • 2020-10-09
      • 2014-03-29
      • 1970-01-01
      • 2016-03-07
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多