我是新手,有点正则表达式,所以请原谅我看似完全愚蠢的问题。
在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> <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'标记为答案,因为他的代码示例让我走上了找到问题所在的道路。
答案 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> <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);
解决了问题。因此,由于清理了编码,字符串中的引号与正则表达式中的引号不相等。希望它可以节省别人的睡眠时间:-)