PHP preg_match双引号匹配

时间:2015-05-27 14:24:23

标签: php regex double double-quotes

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

在PHP中,我试图使用正则表达式匹配,当双引号“出现在来自HTML表单上的控件的文本中并允许它使用时。当前的正则表达式不起作用:

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

因为所有其他角色都可以正常工作,但如果我在文本中添加“仍然无法使用正则表达式。

我在https://regex101.com/上尝试[^a-zA-Z0-9 \"\'\?\-],似乎工作正常。我的PHP实例是否有问题需要修复,或者PHP在某种程度上与https://regex101.com/不一致?

Ian 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'标记为答案,因为他的代码示例让我走上了找到问题所在的道路。

4 个答案:

答案 0 :(得分:1)

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

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:

答案 1 :(得分:0)

关于regexp的一个重要事项是,他们正在寻找与给定模式匹配的主题的任何子串。因此,如果您想允许使用alphanum字符,空格和双引号,请在允许的字符中查找 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)

答案 2 :(得分:0)

这是一个使用的代码,工作正常

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

希望这会有所帮助。

答案 3 :(得分:0)

我发现此讨论有类似的问题: 尝试匹配引号,我的正则表达式在代码的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);

解决了问题。因此,由于清理了编码,字符串中的引号与正则表达式中的引号不相等。希望它可以节省别人的睡眠时间:-)