我正在尝试创建将验证简单模式的正则表达式。这里列出了有效和无效的模式。
有效:
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是有效的,但它不应该因为开头的点而存在。
我错过了什么?
答案 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)
如果您特别希望将foo
,bar
和/或baz
(全部可选)单独列为有效,这也是另一种选择:
/((\*+|(foo|bar|baz)+)(\.(\*+|(foo|bar|baz)+))*)/