2

我有一个正则表达式,它只允许 HTML 表单中名称字段中的特定字符,即字母、空格、单引号、连字符和句点。这是模式:

return mb_ereg_match("^[\w\s'-\.]+$", $name);

问题是这种模式,由于某种原因,当 $name 中有文字星号时返回 true。除非我遗漏了什么,否则这是不可能的。我已经对文字星号进行了多次搜索,我发现的只是"\*"有意匹配它们的模式。

preg_match() 中的相同模式在传递“*John”之类的字符串时也会返回匹配项。

我到底错过了什么?

4

3 回答 3

2

您需要在这些代码前面添加一个双反斜杠。一个转义反斜杠,一个转义转义序列。

您还需要转义-,否则它接受“介于”'和之间的所有字符.

return mb_ereg_match("^[\\w\\s'\\-\\.]+$", $name);

看看一个工作案例(使用preg_match):http: //ideone.com/E8afAM

于 2012-11-07T21:36:55.067 回答
0

当括在方括号中时,连字符用作表示范围的特殊字符。在您的情况下,它将范围内的所有字符匹配'..

转义连字符应该返回所需的结果:

^[\w\s'\-\.]+$
于 2012-11-07T21:42:29.743 回答
0

我有一个正则表达式,它只允许 HTML 表单中名称字段中的特定字符,即字母、空格、单引号、连字符和句点。

你错过了,那\w不是字母字符。php.net说:

“单词”字符是任何字母或数字或下划线字符,即任何可以成为 Perl “单词”一部分的字符。

而且,perl 的定义是:

A\w匹配单个字母数字字符(字母字符或十进制数字)或连接标点字符,例如下划线 ("_")。

连接的标点符号应该仅在我阅读时表示,_但这可能是多字节扩展的错误。

如果您mb_ereg_match仅用于整个 unicode 匹配,请尝试使用preg_match's/u修饰符Unicode 字符属性功能,因为 php 5.1.0

于 2012-11-07T22:20:56.420 回答