【问题标题】:Confusion about preg_match return value in PHP if statementPHP if 语句中 preg_match 返回值的混淆
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 没错。我不知道我是如何没有在心理上处理^ 的。谢谢。
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2019-05-28
相关资源
最近更新 更多