2016-03-30 14 views
-1

i dize temiz bir Karakterler ihtiyaç ve ben sadece Numaraları istiyorum/Farsça/LatinECHO SADECE Sayılar/Farsça/Latin karakterler

function clean($str) { 
    global $mysqli; 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysqli_real_escape_string($mysqli,preg_replace("/^(?!.*[(@#!%$&*)])[A-Za-z\s\x{0600}-\x{06FF}0-9_\.\-]+$/u","",$str)); 
} 

echo clean('a|"[email protected]£d012e^&$ییییfg'); 

i want this =>//echo abcd012eییییfg 

i dont want have any => (@,#,!,%,$,&,|,",£,^*) 
+0

sadece sayı tutarak/latin olur gibi bir şey olmalı: 'preg_replace ("/[^ 0-9a-zA-Z]/"," ", $ str)" belki de farsça karakterler için benzer bir aralık gösterebilir (işe yarayıp yaramadığına dair bir fikir). – apokryfos

cevap

0
Aşağıdaki normal ifade deneyebilirsiniz

:

function clean($mysqli,$str) { 
    //global $mysqli; //pass this as a parameter 
    if (!is_string($str)) { 
     return ""; 
    } 
    $str = trim($str); //Don't need to suppress errors 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysqli_real_escape_string($mysqli,preg_replace("/[^0-9a-zA-Z\x{600}-\x{6FF}]/u","",$str)); 
} 

Ek olarak:

Kullanıcı girdisini dezenfekte etmek için mysqli_real_escape_string'u kullanmayın, özellikle UTF-8 girişi ile uğraşırken güvenilir olamaz, bunun yerine hazırlanmış ifadeler kullanın.

ayrıntılı için:

$sql = "INSERT INTO table VALUES(".clean($value).")"; 

Değişim bunun için:

kod var varsayalım ben Pers karakterler ama hakkında biraz aptal değilim

$sql = "INSERT INTO table VALUES(?)"; 

    if (($s=$mysqli->prepare($sql)) { 
     $stmt->bind_param("s", preg_replace("/[^0-9a-zA-Z\x{600}-\x{6FF}]/u","",$value)); //MySQL will clean it up. 
     $stmt->execute(); 
    } 
+0

güncelledim global $ mysqli; // Bunu engelleyin, globals kötülüktür. $ str = @trim ($ str); // Hataları bastırmayın. Bu da kötülüktür. Bu yöntemi kullanmam gerektiğini anlamışsınızdır. – sharven

+0

Ne yaparsınız? Bir yolu tavsiye et – sharven

+0

'Döşeme' kullanmalısınız. Bunu elde etmenize gerek yok, ancak '@ trim' yapmanıza gerek yok. Kesinti başarısız olursa, bunun işe yaradığını varsaymaktan daha iyi olduğunu biliyorsunuz ve sonra bir hata alıyorsunuz daha aşağı. – apokryfos

0

bu bir dönüş verin. Sadece normal ifadeler kullanır:

function clean($str){ 
    $re = "/([0-9a-zA-Z\x{600}-\x{6FF}])/u"; 
    preg_match_all($re, $str, $matches); 
    return isset($matches[0]) ? implode($matches[0]) : ''; 
} 

echo clean('a|"[email protected]£d012e^&$ییییfg'); 
// output: abcd012eییییfg 
echo clean('a|"[email protected]Β£d艾β012艾e^&$ییییfg'); 
// output: abcd012eییییfg 

olarak here, içinde bir çok here görebilirsiniz

600 ila 6FF Pers karakter vardır çekti: https://3v4l.org/arLMj

+0

Bu, sorulandan daha fazla dilde izin verir. Örneğin. a | "bc! @ Β £ d 艾 β012 艾 e^& $ یییی fg" de Yunanca ve Çince karakterler de içerecektir. – apokryfos

+0

Benim kötü. Bazı kazma ve farsça chars için aralığını buldum. Cevap –