2011-02-22 38 views
1

我要去心理试图找出为什么这不起作用:为什么这个Javascript RegExp测试不工作?

function hasOnlyWhitelistedCharacters(string) 
{ 
    var whitelist = RegExp("\\w"); 
    console.log(whitelist.test(string)); 
    return whitelist.test(string); 
} 

当我运行此字符串: “WWWW ????? * * <> <> <”

该函数返回true。它不应该返回错误吗?事实上,似乎不管我做什么,它都是真实的。

这些也不起作用:

var whitelist = RegExp(\w); 
var whitelist = /\w/; 

回答

3

/\w/匹配字符串中任何位置的单个标识符字符([0-9a-zA-Z_])。要测试整个字符串,请使用anchors(“^”和“$”)和repetition(“+”或“*”,取决于您是否允许空字符串)。尝试使用/^\w*$//^\w+$/,或使用/\W/测试您不想使用的字符串。

function hasOnlyWhitelistedCharacters(string) 
{ 
    var whitelist = /^\w*$/; 
    console.log(whitelist.test(string)); 
    return whitelist.test(string); 
} 
function hasNoBlacklistedCharacters(string) 
{ 
    var blacklist = /\W/; 
    console.log(blacklist.test(string)); 
    return ! blacklist.test(string); 
} 

对于更复杂的黑名单人物类,你可以使用一个complemented class

function hasOnlyWhitelistedCharacters(string) 
{ 
    // match all characters, which must be in the set 
    var whitelist = /^[\w\s\u00C0-\uDFFF\uF900-\uFFFF]*$/; 
    console.log(whitelist.test(string)); 
    return whitelist.test(string); 
} 

function hasNoBlacklistedCharacters(string) 
{ 
    // match one character not in the set 
    var blacklist = /[^\w\s\u00C0-\uDFFF\uF900-\uFFFF]/; 
    console.log(blacklist.test(string)); 
    return ! blacklist.test(string); 
} 

使用正则表达式时要小心字符编码。其实,在任何情况下都要小心字符编码。关于编码的假设可能导致安全漏洞。

+0

最终,我试图列出所有unicode字符,但禁止可用于脚本注入攻击的任何字符。 – Questioner

+0

你在说XSS吗?您需要在服务器上执行此操作。除非你使用服务器端JS,否则上述永远不会是一个安全的解决方案。 – outis

+0

+1代码!今天早些时候我刚刚花费了一些时间,发现Javascript不支持基于POSIX的Unicode字符识别方式,在这里您可以看到我正在实现的Unicode范围解决方案。真棒。感谢那。 – Questioner

1

返回true,因为第一个字符是字符和你的正则表达式的测试只有第一个字符是字符。 尝试\w+$如果我明白你想要什么

+0

感谢您的回应,虽然RegExp(“\\ w +”)也似乎不起作用。我想你明白我要做什么,但要清楚,如果字符串中的任何字符不在白名单中,我想要通过测试。 – Questioner

+0

正则表达式匹配字符串中的任意位置。 “+”将使“\ w”匹配一次或多次,这仍然会匹配样本字符串。 – outis

+0

\ w + $将与此示例一起使用 –

3

试试这个:

var whitelist=/^\w*$/; 

^迫使它尝试在字符串的开头匹配。 $强制它匹配结束。 \w之后的*使其匹配\w的多个实例。

+0

我不确定是否应该为此打开一个新的问题,但Javascript正则表达式是否支持“标点符号”?如:RegExp(“^ \ p {标点符号}] + $”); – Questioner

1

它返回true,因为wwww?????**<><><字符串具有列入白名单的字符。您必须在此正则表达式中添加字符串的开头和结尾

3

如果您要检查目标字符串是否只包含白名单字符,则需要指定除此之外什么都不需要。添加开始和结束标记并重复使其工作。

^\ w + $

+0

好的,这是在某个地方。除了一个问题,这是禁止unicode字符的工作。我想\ w会允许unicode字符,例如日语和中文,因为我在stackoverflow上看到的相关问题上的另一个答案。但是,现在我发现这是错误的。有没有办法白名单unicode字符? – Questioner

+0

@ebisudave:哪个unicode字符? Unicode包括它们全部。 – outis

2

到一组白名单中的字符匹配至少一个白名单的性格,试试这个:^\w+$

至少匹配零白名单字符在一组白名单字符中,试试这个:^\w*$

- 克拉(^)表示模式必须位于字符串的开头,并且美元符号($)表示该模式必须位于字符串的末尾。通过在^ $中包装你想要搜索的内容,任何非指定的“垃圾”将强制正则表达式返回false。

虽则回答你的问题:

\\w应该返回false,因为你是取消转义反斜杠,并把它变成一个普通的字符。你实际上搜索字面意思是“反斜线双U”,因为你正在寻找任何白名单中的字符

\w将返回true快速谷歌搜索给了我一些网站,你可以测试你的正则表达式(如果您想),他们会帮助提供一些反馈:

http://www.myregextester.com/index.php

我也想使正则表达式时,如果你不拥有的一切记忆使用备忘单建议

http://www.regular-expressions.info/reference.html