preg_match没有返回正确的值?

时间:2016-04-07 03:13:09

标签: php preg-match

所以为了测试我的代码,我让它返回" 0"为假和" 1"真的。现在,这里是我对此代码的测试。

echo input("title", "asdfasdfasdfasdfasdfasdfasdf should be safe input");
echo input("title", "sdfsdfsdf sdfsdfsdf should be safe input");
echo input("title", "Omg what's this should be safe input");
echo input("title", "<a href>This should not be safe input");
echo input("user", "This_should_be_safe");

以下是我的代码

function input($type, $input) {
    global $config, $alert;
    if ($type == "user") {
        if (preg_match('/^[a-zA-Z0-9_]+$/', $input))
            return "1";
        else
            return "0";
    } else if ($type == "safetitle") {
        if (preg_match('/^[a-zA-Z0-9_]+$/', $input))
            return true;
        else
            return false;
    } else if ($type == "title") {
        if (preg_match('/[^0-9a-z\s-\'!?#_]/i', $input))
            return "1";
        else
            return "0";
    } else if ($type == "body") {
        if (preg_match('/[^0-9a-z\s-\'!?#_]/i', $input))
            return true;
        else
            return false;
    }
}

仅对用户&amp;标题类型,但他们都按照这个确切的顺序返回这些结果。

`00011`

我不认为我做错了什么,因为我在Regexr中使用它时表明它是正确的(至少我认为它确实如此)

2 个答案:

答案 0 :(得分:0)

title区块中,您可以使用:

preg_match('/[^0-9a-z\s-\'!?#_]/i', $input)

这意味着,如果我看到任何不是(^0-9a-z\s-',{ {1}},!?#,返回_。在前三个输入中,您将提供纯1,因此它会为您提供a-z。在您的第四个输入中,您在文本中提供0,因此它会给出<。如果你想反转结果,你只需要删除否定1

^块中,您可以使用:

user

这意味着,任何preg_match('/^[a-zA-Z0-9_]+$/', $input) a-zA-Z0-9位于开头和&amp;之间。结束,将返回_。因此这是正确的。

我不能推荐一个更好的解决方案,因为你没有告诉我们你的主要目标是什么,这段代码看起来像做某种卫生,我不建议做这样的,因为它根本没有涵盖所有这些。

答案 1 :(得分:0)

我相信你的正则表达式有3个问题

if ($type == "title") {...if($type == "body") {..

你的正则表达式:/[^0-9a-z\s-\'!?#_]/i

  1. 第一个问题是&#39; ^&#39;是在&#39; []&#39;当它在里面时,否定括号内的任何内容,以便找到包含那些字符的字符。
  2. 第二个问题是你应该有一个&#39; ^&#39;在表达的开头和&#39; $&#39;在末尾。这意味着仅当所有字符都符合要求时才返回true
    1. 第三个很小,只记得在结束后有一个+符号&#39;]&#39;表示是否在括号中找到一个或多个字符。
  3. 你的最终正则表达式应该像^/[0-9a-z\s\-\'!?#_]+$/i