【问题标题】:PHP - Sanitize string removes numbersPHP - 清理字符串删除数字
【发布时间】:2018-01-28 04:05:33
【问题描述】:

我正在尝试在数组中定义允许的字符,然后根据该数组清理字符串。下面的代码效果很好,只是它也删除了 0-9 字符!

有人能解释一下这是为什么吗?

代码:

    <?php

//Allowed characters within user data:
$symbols = array();
$symbols += range('a', 'z');
$symbols += range('A', 'Z');
$symbols += range('0', '9');
array_push($symbols,' ','-'); // Allow spaces and hyphens.

//----test 1

//data to test.
$someString = "07mm04dd1776yyyy";

//sanatize
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/i", "", $someString));

echo "$someString\n";

//----test 2
$someString = "Another-07/04/1776-test-!@#$%^&*()[]\\;',./\"[]|;\"<>?";

//sanatize
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/i", "", $someString));

echo "$someString\n";

?>

输出:

mmddyyyy
Another--test-

旁注(编辑):这是与数据库结合使用但它超越了数据库,数据库中的数据用于编写将用户导入活动目录的powershell脚本,并且不允许使用许多字符,加上旧系统也只允许这些字符。

提前谢谢你, 韦恩

【问题讨论】:

  • 旁注:这是否与数据库有任何关系?如果是这样,您不需要所有这些。您可以使用准备好的语句。
  • 可以,但是超出了DB,DB里的数据是用来写powershell脚本的字符也。
  • 我怀疑这是您将范围添加到数据库的方式的问题 - 如果您首先放置 $symbols += range('0', '9'); 行,它会将数字添加到数组中,但实际上,@如果您打印出来,987654324@ 不包括数字。在这两种情况下,它似乎都不包含大写字母。
  • @WayneWorkman - 我不知道;我什至不知道您可以使用 + 附加到数组,所以我怀疑这可能是问题所在。您可以改用array_push 吗?
  • 保留大写字符的原因是正则表达式中的/i 标志使其不区分大小写。

标签: php sanitization


【解决方案1】:

根据@andrewsi 所说的未将允许的字符添加到数组中,我想出了如何正确添加它们。下面的代码显示了它们被添加,以及测试字符串的输出。

可能有更好的方法来做到这一点,所以我将它添加到社区 wiki。

<?php

//Allowed characters within user data:
$symbols = array();
array_push($symbols,implode("",range('0', '9')));
array_push($symbols,implode("",range('a', 'z')));
array_push($symbols,implode("",range('A', 'Z')));
array_push($symbols,' ','-'); // Allow spaces and hyphens.

print_r($symbols);
echo "\n";

//----test 1

//data to test.
$someString = "07mm04dd1776yyyy";

//sanatize
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/", "", $someString));

echo "$someString\n";

//----test 2
$someString = "Another-07/04/1776-test-!@#$%^&*()[]\\;',./\"[]|;\"<>?";

//sanatize
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/", "", $someString));

echo "$someString\n";

?>

输出:

Array
(
    [0] => 0123456789
    [1] => abcdefghijklmnopqrstuvwxyz
    [2] => ABCDEFGHIJKLMNOPQRSTUVWXYZ
    [3] =>  
    [4] => -
)

07mm04dd1776yyyy
Another-07041776-test-

【讨论】:

  • 我很好奇为什么你不使用元字符而不是像preg_replace('/[^a-zA-Z\d- ]/', ''); 这样将替换除连字符和空格以外的任何特殊字符。示例:ideone.com/ngOrjQ 我还添加了一些其他特殊字符。所以你不需要使用array_push,只需像这样使用$array[] = $valueideone.com/R9VK00
  • @fyrye 因为我还在学习 php,并且因为我不理解你在你发布的 preg_replace 语句中输入的所有字符,而我上面写的方式对我来说很有意义并且是对我来说很容易理解。
  • 元字符可以被查找并且对于所有使用正则表达式的编程语言来说是相当标准的。 hscripts.com/tutorials/regular-expression/…。所以我写的表达式[^]表示不匹配的模式,a-z是小写字符a到z,A-Z是大写字符A到Z,\d是任何数字字符(与0-9相同),除了文字- 和` `(空格与\s 不同)之外,几乎就是这样。实际上与您编写的数组相同。
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多