我正在尝试创建将验证简单模式的正则表达式。此处列出了有效和无效模式。
有效:
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})?)?$/
如果您
特别想挑出foo
、bar
和/或baz
(全部可选)作为有效,这也是另一种选择:
/((*+|(foo|bar|baz)+)(.(*+|(foo|bar|baz)+))*)/