PHP preg_match 双引号匹配

PHP preg_match double quote matching

我是新手,有点不懂正则表达式,所以请原谅我这个看似完全愚蠢的问题。

在 PHP 中,当双引号 " 出现在 HTML 表单控件的文本中并允许使用它时,我正在尝试使用正则表达式进行匹配。当前的正则表达式不工作:

preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v)

因为所有其他字符都可以正常工作,但是如果我在文本中放置一个 ",它仍然无法通过正则表达式。

我在 https://regex101.com/, and it seems to work ok. Is there something wrong with my PHP instance that needs fixing, or is PHP in some way not working consistently with https://regex101.com/ 上试过 [^a-zA-Z0-9 \"\'\?\-]?

伊恩·J.

编辑:

输入:测试

输出:10

编辑:

$v = test"
$n = 50
$s = Name:
$f = $fail (which is passed by reference as a counter)

function validate_text($v, $n, $s, &$f)
{
    if ($v == "")
    {
        ++$f;
        return "<span class='error'>".$s."</span>";
    }
    elseif ((strlen($v) > $n) || preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v))
    {
        ++$f;
        return "<span class='error'>".$s."</span>&nbsp;<span class='errorextra'>(Please enter only upper or lower case letters, numerals, spaces, and basic punctuation, maximum ".$n." characters)</span>";
    }
    return $s;
}

编辑:好的,$_POST 值和它传递给变量之间似乎发生了一些奇怪的事情。我将不得不调查并返回。但目前,这个问题暂时搁置。

编辑:一些初步调查指出,在代码中早些时候对 htmlentities 的调用中发生了转换,将双引号转换为其他内容。因此我不认为这是一个正则表达式问题。我已将 'beiller' 标记为答案,因为他的代码示例让我走上了寻找问题实际所在的道路。

你的问题有点令人困惑,所以让我描述一下你的正则表达式的作用:

preg_match('/[^a-zA-Z0-9 \"\'\?\-]/', $v)

它将匹配任何不包含 a-zA-Z0-9 \"\'\?\-

的字符串

此外,您正在使用 \" 转义 ",这是没有必要的。尝试删除反斜杠。

输入 test" 不应与此正则表达式匹配,因为它包含字母 "t".

我又试了一次,但回答得太快了。试试下面的代码:

$v = 'test"';
$n = 50;
$s = 'Name:';
$f = 0;

function validate_text($v, $n, $s, &$f)
{
    if ($v == "")
    {
        ++$f;
        return "<span class='error'>".$s."</span>";
    }
    elseif ((strlen($v) > $n) || preg_match('/[^a-zA-Z0-9 "\'\?\-]/', $v))
    {
        ++$f;
        return "<span class='error'>".$s."</span>&nbsp;<span class='errorextra'>(Please enter only upper or lower case letters, numerals, spaces, and basic punctuation, maximum ".$n." characters)</span>";
    }
    return $s;
}

echo validate_text($v, $n, $s, $f);

输出:

Name:

关于 regexp 的一件重要事情是他们正在寻找与给定模式匹配的主题的 any 子字符串。因此,如果您想允许说字母数字字符 space 和双引号,请在允许的字符中查找 not 的所有内容,并否定 preg_match 结果.

var_dump(!preg_match('/[^[:alnum:] "]+/', 'lorem ipsum dolor si amet 42'));
=> bool(true)
var_dump(!preg_match('/[^[:alnum:] "]+/', 'lorem ipsum "dolor" si amet'));
=> bool(true)
var_dump(!preg_match('/[^[:alnum:] "]+/', 'lorem&ipsum "do^or" +si amet'));
=> bool(false)

这是我正在使用的代码,运行良好

function somefunc($value)
{
    $result= preg_replace("#[?.&,;\"\'@\-_ \/]#", " ", $value);
    return $result;
}

希望这会有所帮助。

我发现这个讨论有类似的问题: 试图匹配引号,我的正则表达式在代码的 JavaScript 部分工作正常并通过了 https://regex101.com/ 的测试,但在 php 部分无法正常工作。

将正则表达式外部引号从双引号更改为单引号并返回,转义或不转义正则表达式内的引号 – 没有任何区别。

解决方案:我过滤了字符串

filter_input(INPUT_POST, 'my_var', FILTER_SANITIZE_STRING);

删除过滤器或添加标志

filter_input(INPUT_POST, 'my_var', FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);

解决了问题。因此,由于净化编码,字符串中的引号和正则表达式中的引号不相等。希望它能节省一些人的失眠时间:-)