关于PHP if语句中的preg_match返回值的困惑

时间:2014-01-30 15:42:46

标签: php regex preg-match

我正在使用此代码,该代码几乎逐字逐句地来自Ra​​smus Lerdorf的 Programming PHP (第291页),以确保POSTed表单字段'story_title'中的值包含只有字母,空格,单引号或连字符:

if (preg_match('/[^A-Za-z \'\-]/', $_POST['story_title'])) {
    die('Illegal characters in story_title.');
} else { 
    $story_title = $_POST['story_title'];
}

我对PHP不是很熟悉,但我将其读作:

Does $_POST['story_title'] contain letters, hyphens, single quotes and/or spaces?
    Yes? Error!
    No? Excellent. Proceed.

什么?代码“有效”,因为它会过滤掉不需要的字符(<,>,(,)等),但我不明白它是如何或为什么有效。似乎preg_match的if语句应该以相反的方式流动,preg_match如果只存在合法字符则返回true,如果不存在则false$_POST['story_title']

documentation表示“如果模式与给定主题匹配,则preg_match()返回1,如果不匹配,则返回0;如果发生错误,则返回FALSE”并且还警告“此函数可能返回布尔值FALSE,但是也可能返回一个非布尔值,其值为FALSE,“这对我来说只会让事情变得更加模糊。当{{1}}仅包含合法字符时,该函数不应返回1吗?

有人可以解释一下这段代码究竟发生了什么吗?我很高兴它似乎工作,但我很难使用我不理解的代码。

1 个答案:

答案 0 :(得分:1)

在正则表达式中,[a-z]表示“组a到z中的任何字符”,而[^a-z]表示“组中包含所有但是 a到的任何字符” Z”。