2016-09-24 3 views
1

배열에 허용 된 문자를 정의하려고 시도하고이 배열을 기반으로 문자열을 삭제합니다. 아래의 코드는 0-9의 문자도 제거한다는 점을 제외하면 꽤 잘 작동합니다!PHP - Sanitize 문자열이 숫자를 제거합니다

누군가 이유를 설명해주세요.

코드 :

<?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

을 주셔서 감사합니다, 나는 제대로을 추가하는 방법을 알아 냈어. 아래 코드는 추가 된 코드와 테스트 문자열의 출력을 보여줍니다.

이렇게하는 것이 더 좋은 방법 일 수 있으므로 커뮤니티 위키에 추가했습니다.

<?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 다른 특수 문자도 추가했습니다. allso 당신은'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