【发布时间】: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