我想只允许字母,数字,空格,unserscore和连字符。
到目前为止,我认为这个preg_match可以完成这项任务:
if(preg_match('/[^a-z0-9 _]+$/i', $name)) {
$error = "Name may only contain letters, numbers, spaces, \"_\" and \"-\".";
}
但我刚刚意识到字符串中的特殊字符不会产生错误。例如
您好“@£$乔
不会产生错误。是否有可能做出一点改变并使其有效,或者我是否需要另一种解决方案?
答案 0 :(得分:3)
问题在于$
符号。你特意要求它匹配字符串的结尾。表达式/[^a-z0-9 _]+$/i
与hello"@£$joe
不匹配,因为joe
与[a-z0-9 _]+$
匹配;所以当你否定班级时,它显然是不匹配的。删除$
符号,所有内容都符合预期:
if(preg_match('/[^a-z0-9 _]+/i', $name)) {
// preg_match will return true if it finds
// a character *other than* a-z, 0-9, space and _
// *anywhere* inside the string
}
在浏览器中通过在JavaScript控制台中逐个粘贴这些行来测试它:
/[^a-z0-9 _]+/i.test("@hello"); // true
/[^a-z0-9 _]+/i.test("joe@"); // true
/[^a-z0-9 _]+/i.test("hello\"@£$joe"); // true
/[^a-z0-9 _]+/i.test("hello joe"); // false
答案 1 :(得分:0)
您需要将^
置于角色类之外:
if(preg_match('/^[a-z0-9 _]+$/i', $name)) {
一个^
里面(开头)一个字符类就像一个字符类否定器。
答案 2 :(得分:0)
/^([a-z]|[A-Z]|[0-9]| |_|-)+$/
使用此正则表达式
答案 3 :(得分:0)
这里拿这个:
/^[a-z0-9\s\-_]+$/i
这个表达式由我用虚拟数据测试。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script>
function valueanalysis(form){
var vals = form.vals.value;
alert(/^[a-z0-9\s\-_]+$/i.test(vals));
return false;
}
</script>
</head>
<body>
<form onsubmit="return valueanalysis(this);">
<input type="text" name="vals"/>
<input type="submit" value="Check" />
</form>
</body>
</html>
在html文件中使用此代码,通过填写值检查验证,然后按Enter键检查是否为真。
注意: - 所有语言的正则表达式都相同。
<?php
if(preg_match("/^[a-z0-9\s\-_]+$/i","ASDhello-dasd asddasd_dsad")){
echo "true";
}
else{
echo "false";
}
?>