-1

我正在尝试验证一些输入,但我得到了相反的结果(或者我完全错过了该preg_match函数的使用?)

这是我的代码:

$check_firstname = "@#";
if(preg_match('/[^A-Za-z0-9_]/', $check_firstname)) echo "valid"; else echo "invalid";

我会认为这个正则表达式preg_match不仅允许字母数字字符,而且这个输入给出的输出valid!如果输入(在本例中check_firstname为 )不是字母数字,为什么要preg_match找到匹配项?我已经检查了文档,但我不明白发生了什么。

我真正的要求是在用户输入中允许破折号 (-) 和字母数字字符,但是当我的基本测试似乎不起作用时,我不知道如何到达任何地方。

编辑

谢谢您的反馈!我现在遇到插入符号的问题。但是我忘了提到除了破折号之外,我还需要允许空格。

4

5 回答 5

3

当它位于括号内时,您使用的^符号表示“不”。这是一个关于正则表达式语法的好网站。在单行模式下,\s允许使用制表符和空格。注意:连字符需要放在最后,因此它不会尝试将其视为一个范围。

if(preg_match('/^[A-Z0-9\s-]+$/i', $check_firstname)){
echo "valid"; } else {echo "invalid";}
于 2013-05-30T09:18:07.357 回答
1

试试这个:

if(preg_match('/^[A-Za-z0-9_]+$/', $check_firstname)===1){ echo 'Valid'; } else { echo 'Invalid'; }

只是在不正确的地方放置了 ^ 字符,并且还添加了 $ 符号来表示匹配的结束。

您还应该使用类型/值比较,因为此函数可以返回 3 个不同的值:

(int)1 = Match found
(int)0 = Match not found
(bool)false = Error
于 2013-05-30T09:19:22.880 回答
1

您只是将插入符号 ( ^) 放在错误的位置:)

[^...]匹配方括号之间找到的任何字符。

^单独表示字符串的开头。

[^A-Za-z0-9_]表示正则表达式将检查字符串中的第一个字符,如果该字符不是字母数字或下划线,它将通过。

要仅允许字母数字字符和破折号,您将使用:

^[A-Za-z0-9-]+$

+一次或多次)和$(字符串结尾)运算符将确保检查整个字符串。

请注意,此正则表达式不允许使用下划线 ( _)。如果您需要允许它们,您可以在 Casimir 的回答中使用正则表达式。

也允许空格:

^[A-Za-z0-9\s-]+$
于 2013-05-30T09:20:21.243 回答
1

你可以使用这个:

if(preg_match('/^[\w- ]+$/', $check_firstname)) echo "valid"; else echo "invalid";
于 2013-05-30T09:20:52.043 回答
0

为什么不坚持你的正则表达式并改变解释?

if(preg_match('/[^A-Za-z0-9_]/', $check_firstname)) echo "invalid"; else echo "valid";

如果正则表达式匹配,您知道 $check_firstname 至少包含一个不是字母、数字或下划线的字符 --> 使其无效

qed

于 2013-05-30T10:37:29.687 回答