我写了一个简单的函数来检查我发送的字符串是否“有效”。
// this works without problems
function validate_email ($value) {
return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value);
}
// this doesn't work
function validate_string ($value) {
return preg_match ("([^<>?=/\]+)", $value);
}
第一个功能很有效,如果我向validate_email
发送电子邮件,我习惯保留有效,如果没有,则返回1
或0
。
validate_string
应对所有类型的字符串执行相同操作,但不使用? = < > / \
。如果我检查功能,它会以任何形式返回1,为什么?
validate_string ("tonino"); // return 1 ok
validate_string ("ton\ino\"); // return 1 why?
validate_string ("ton?asd=3"); // return 1 why?
^
里面的([^<>?=/]+)
字符应该表示不是后面的字符(或不是?)
答案 0 :(得分:4)
您不匹配字符串的开头(^
)和结尾($
)。所以"ton?asd=3"
匹配,因为模式匹配t
(并且字符串的其余部分无关紧要)。
答案 1 :(得分:1)
您的代码中存在多个错误。除了"ton\ino\"
不是有效字符串且[^<>?=/\]+
不是有效的正则表达式之外,您可能还有一些逻辑上的误解。
如果至少有一个字符不是[^<>?=/\\]+
,<
,>
,?
,那么您的正则表达式=
(此处已更正)将匹配,/
和\
。因此,如果至少有一个此类字符,则preg_match
会返回1
。 ton\ino"
和ton?asd=3
都包含至少一个此类字符(两种情况下都匹配ton
)。
对此的修复是对字符串的开头和结尾使用断言(^
和$
)以仅允许整个字符串的合法字符:
^[^<>?=/\\]+$
或者使用正面字符类[<>?=/\\]+
来匹配非法字符并否定返回的preg_match
表达式:
function validate_string ($value) {
return !preg_match("([<>?=/\\\\]+)", $value);
}
但使用白名单而不是黑名单肯定会更好。
答案 2 :(得分:0)
\
是一个元字符,你需要逃避它。所以它会是
return preg_match ("([^<>?=/\\\\]+)", $value);
答案 3 :(得分:0)
function validate_string ($value) {
return !preg_match('#[<>?=/\\\\]#', $value);
}