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> <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> <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);
解决了问题。因此,由于净化编码,字符串中的引号和正则表达式中的引号不相等。希望它能节省一些人的失眠时间:-)
我是新手,有点不懂正则表达式,所以请原谅我这个看似完全愚蠢的问题。
在 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> <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> <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);
解决了问题。因此,由于净化编码,字符串中的引号和正则表达式中的引号不相等。希望它能节省一些人的失眠时间:-)