2016-09-24 10 views
1

配列に許容される文字を定義しようとしていて、この配列に基づいて文字列をサニタイズしようとしています。以下のコードは、0〜9の文字も削除している点を除いては、かなりうまく機能します。PHP - サニタイズ文字列で数値が削除される

誰かがなぜこれを説明できますか?

コード:

<?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/[email protected]#$%^&*()[]\\;',./\"[]|;\"<>?"; 

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

echo "$someString\n"; 

?> 

出力:

mmddyyyy 
Another--test- 

追記(編集):これは、データベースと連動して使用されているが、それはDBを超えて、DB内のデータを使用していますユーザーをActive Directoryにインポートするpowershellスクリプトを作成し、多くの文字は許可されず、古いシステムでもこれらの文字のみが許可されます。

は@andrewsiが許さ文字が配列に追加されていないと、私はそれらを適切に追加する方法を考え出したもののオフに行く、事前に ウェイン

+0

追記:これは万が一のデータベースとは何かを持っていますか?もしそうなら、あなたはそのすべてを必要としません。準備されたステートメントを使用することができます。 –

+0

これはDBを超えていますが、DB内のデータを使用してユーザーをActive Directoryにインポートするpowershellスクリプトを作成し、多くの文字は許可されず、古いシステムでもこれらの文字のみが許可されます。 –

+0

私はあなたの質問にあなたが気に入らなければあなたのコメントを編集として追加しました。それは可能な答えの結果に関係するかもしれない。 –

答えて

0

、ありがとうございました。以下のコードは、それらが追加されたことと、テスト文字列の出力を示しています。

おそらくこれを行うより良い方法があるので、私はそれをコミュニティの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/[email protected]#$%^&*()[]\\;',./\"[]|;\"<>?"; 

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

echo "$someString\n"; 

?> 

出力:

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

07mm04dd1776yyyy 
Another-07041776-test- 
+0

なぜpreg_replace( '/ [^ a-zA-Z \ d-] /'、 '');のようなメタ文字を使わないのか不思議です。これはハイフンやスペース以外の特殊文字を置き換えます。例:http://ideone.com/ngOrjQ他の特殊文字も追加しました。あなたは 'array_push'を使う必要はありません。単に' $ array [] = $ value'を以下のように使ってください:http://ideone.com/R9VK00 – fyrye

+0

@fyrye私はまだPHPを学んでいるので、あなたが投稿したpreg_replaceステートメントに書いたすべての文字を理解できません。上に書いた方法は私には意味があり、わかりやすいものです。 –

+0

メタキャラクタはルックアップでき、正規表現を使用するすべてのプログラミング言語ではかなり標準的です。 https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php。''^'と書いた表現は一致しないパターンを意味し、 '' az''は小文字a~z、 '' AZ''は大文字のA~Z、 '\ d'は任意の数字文字(0- 9)、それは文字通りの '-'と' '(' \ s'と同じではありません。あなたが書いた配列と事実上同じです。 – fyrye

関連する問題