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

时间:2013-11-16 08:39:23

标签: php regex validation preg-match match

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

有效:

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

我错过了什么?

3 个答案:

答案 0 :(得分:2)

使用此正则表达式:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果您特别希望将foobar和/或baz(全部可选)单独列为有效,这也是另一种选择:

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