Preg_match撇号

时间:2014-06-13 20:55:56

标签: php regex

我有一个需要允许撇号的输入字段(文本区域)。这就是我所拥有的。

if (!empty($_POST["adv"]) && !preg_match("#^[a-zA-Z0-9 \.,\?_/'!£\$%&*()+=\r\n-]+$#",$_POST["adv"])){
    $addErr = "Please use letters, numbers, and common punctuation only"; $valid = false;
}
if (!empty($_POST["adv"]) && mb_strlen($_POST["adv"], 'UTF-8') > 500){
    $addErr = "Ad must not exceed 500 characters"; $valid = false;
}
$add = htmlspecialchars($_POST['adv']);

如果文本输入中包含撇号,则代码会中断并且不会更新数据库。如果文本不包含撇号,则preg match会准确验证,并且数据库会更新。

我试过逃避,双重逃避,并且没有成功地移动撇号。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我想你的问题不在于正则表达式,而在于SQL语句本身:你应该通过使用像mysqli_real_escape_string这样的函数或者更好的prepared statements来正确地转义数据库查询。

撇号用于在SQL语句中引用字符串;如果你的字符串中有一个未转义的撇号,整个查询将会中断。请参阅PHP manual有关如何正确转义SQL语句的信息 - 这对您的网站来说也是一个严重的安全风险。

您已尝试使用htmlspecialchars转义字符串,如果您将字符串输出到HTML上下文中,这对于防止XSS很好,但它不适合数据库上下文。始终使用适合您正在插入的上下文的工具来转义数据。

答案 1 :(得分:1)

如果您使用的是PDO,请在quote()之前使用INSERT方法:

`$ DB->引号($ MyString的)...

prepared statements

为什么插入会崩溃?

听起来我正在通过粘贴各种字符串和代码来构建INSERT查询。如果这些位中的一个作为未被转义的引用,则整个查询具有新的含义,并且不再能被MySQL解析。

提示

使用破坏代码的查询,打印查询,以便您可以看到错误。您可能还希望将其转储到可以突出显示MySQL语法的工具中,例如SQLYog,HeidiSQL等。

您的正则表达式

除此之外,您的正则表达式可以清理。这相当于你正在使用的正则表达式,但在眼睛上更容易:

$regex = "~^[\w .,?'!£$%&*()+=\r\n-]+$~";
  1. \w将匹配所有字母,数字和下划线字符
  2. 删除了期间内的反斜杠以及其他不需要在字符类中转义的字符。