PHP if语句中preg_match返回值的混淆

PHP if语句中preg_match返回值的混淆,php,regex,preg-match,Php,Regex,Preg Match,我使用的代码几乎是Rasmus Lerdorf(第291页)从编程PHP中一字不差地提取的,以确保发布表单字段“story_title”中的值只包含字母、空格、单引号或连字符: if (preg_match('/[^A-Za-z \'\-]/', $_POST['story_title'])) { die('Illegal characters in story_title.'); } else { $story_title = $_POST['story_title']; }

我使用的代码几乎是Rasmus Lerdorf(第291页)从编程PHP中一字不差地提取的,以确保发布表单字段“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\u match
的if语句应该以相反的方式流动,如果只存在合法字符,则
preg\u match
返回
true
,如果不存在则返回
false

“preg_match()表示,“如果模式与给定主题匹配,则返回1;如果模式与给定主题不匹配,则返回0;如果出现错误,则返回FALSE”,并警告“此函数可能返回Boolean FALSE,但也可能返回计算结果为FALSE的非Boolean值”,这只会让我更加困惑。当
$\u POST['story\u title']
只包含合法字符时,函数不应该返回1吗


有人能解释一下这段代码中到底发生了什么吗?我很高兴它似乎能起作用,但我很难使用我不懂的代码。

在正则表达式中,
[a-z]
表示“组a到z中的任何字符”,而
[^a-z]
表示“组中除a到z以外的任何字符”。

[^a-Za-z\-]
表示输入不包含此处列出的任何字符。请注意,在否定的开始处,我想我一直不理解preg_match,我只是完全忽略了正则表达式本身。非常感谢你;问题解决了,没错。我不知道我是如何不在心里处理
^
。非常感谢。