【发布时间】:2014-01-30 23:50:43
【问题描述】:
我正在使用这段代码,该代码几乎逐字逐句摘自 Rasmus Lerdorf 的 Programming PHP(第 291 页),以确保 POST 表单字段“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。
documentation 表示“preg_match() 如果模式匹配给定主题,则返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE”并警告“此函数可能返回布尔值 FALSE,但也可能返回一个评估为 FALSE 的非布尔值,”这只会让我的事情变得更加模糊。 $_POST['story_title'] 只包含合法字符时,函数不应该返回 1 吗?
有人能解释一下这段代码到底发生了什么吗?我很高兴它似乎可以工作,但我很难使用我不理解的代码。
【问题讨论】:
-
[^A-Za-z \'\-]表示输入是否不包含此处列出的任何字符。注意^在开头的否定。 -
一直以来,我认为我不理解
preg_match,而且我对正则表达式本身完全一无所知。非常感谢;问题解决了。 -
Wrangling function preg_match(),尤其是那种意想不到的返回值。这真让人生气。官方文档在这方面的帮助很小(太神秘了)。
标签: php regex preg-match