preg_match如何正常工作?

时间:2010-01-25 14:33:55

标签: php regex validation

我写了一个简单的函数来检查我发送的字符串是否“有效”。

// 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发送电子邮件,我习惯保留有效,如果没有,则返回10


validate_string应对所有类型的字符串执行相同操作,但不使用? = < > / \。如果我检查功能,它会以任何形式返回1,为什么?

validate_string ("tonino"); // return 1 ok
validate_string ("ton\ino\"); // return 1 why?
validate_string ("ton?asd=3"); // return 1 why?

^里面的([^<>?=/]+)字符应该表示不是后面的字符(或不是?)

4 个答案:

答案 0 :(得分:4)

您不匹配字符串的开头(^)和结尾($)。所以"ton?asd=3"匹配,因为模式匹配t(并且字符串的其余部分无关紧要)。

答案 1 :(得分:1)

您的代码中存在多个错误。除了"ton\ino\"不是有效字符串且[^<>?=/\]+不是有效的正则表达式之外,您可能还有一些逻辑上的误解。

如果至少有一个字符不是[^<>?=/\\]+<>?,那么您的正则表达式=(此处已更正)将匹配,/\。因此,如果至少有一个此类字符,则preg_match会返回1ton\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);
}