2009-05-18 160 views
1

我想在PHP中使用以下正则表达式检查任何非法字符。基本上,我只想要允许字母数字和下划线(_)。不幸的是,后面的一段代码似乎无法正常工作。如果字符串$ username中有任何非法字符,它应该返回true。但是,它仍然允许字符串中的任何字符。任何想法正则表达式有什么问题?使用正则表达式检查字符串是否为非法字符

if (!preg_match("/^[-a-z0-9_]/i", $username)) 
{ 
    return true; 
} 

在此先感谢。

回答

15

您的代码会检查第一个字符是否无效。要检查是否存在任何无效字符,否定你的性格类,而不是函数的返回和删除锚点:

if (preg_match("/[^-a-z0-9_]/i", $username)) 
{ 
    return true; 
} 

你也,当然,它缩短/[^-\w]/(“字”字符字母,数字和下划线),如果你不想破折号,甚至只是/\W/

+2

该解决方案比匹配整个字符串的要好,因为可以的preg_match当它遇到非允许的字符尽快返回true。虽然,与用户名一样短的东西并不重要。 – Pianosaurus 2009-05-18 17:10:02

1

您的表情只匹配1个字符。尝试/^ [ - a-z0-9 _] + $/i'+'匹配多于1个字符,'$'是行尾的锚点

1

您需要将它锚定在最后,而不是仅仅检查第一个字符。改为尝试"/^[-a-z0-9_]*$/i"

0

你没有一个中继器。你需要一个转发器,如+。据我所知,如果不执行它,你检查行的开始和一个匹配a-zA-Z0-9和_的字符,但没有跟随第一个字符。

2

如果$username只有字母数字和下划线它将返回TRUE

if (preg_match("/^[a-z0-9_]+$/i", $username)) 
{ 
    return true; 
} 
相关问题