用于验证简单模式的正则表达式



我正在尝试创建将验证简单模式的正则表达式。此处列出了有效和无效模式。

有效:

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模式是有效的,但不应该因为开头的点而有效。

我错过了什么?

使用此正则表达式:

/^(*{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/>";
}

您可以使用此正则表达式:

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

特别想挑出foobar和/或baz(全部可选)作为有效,这也是另一种选择:

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

最新更新