2015-09-18 148 views
1

我想驗證輸入(aA-zZ &αΑ-ωΩ)我到目前爲止想出了這個,因爲正則表達式等並沒有完全對付XSS &二階SQL注入。希臘字母驗證PHP字符串

但是,它會打印錯誤,因爲它將希臘字符(「α」)視爲2字節字符。

<?php 

validate_string_chars("aaαα"); 

function validate_string_chars($string) { 

    //$valid_chars = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); 
    //$valid_chars = range('a', 'z'); 
    $english_low = range('a', 'z'); 
    $english_cap = range('A', 'Z'); 
    $greek_low  = array('α', 'β'); 
    $greek_cap  = array('Α', 'Β'); 
    $valid_chars = array_merge($english_low, $english_cap, $greek_low, $greek_cap); 

    $errors = 0; 

    for($i = 0; $i < strlen($string); $i++) { 
     $char = substr($string, $i, 1); 
     if (!in_array($char, $valid_chars)) { $errors++; } 
    } 

    echo "\n\r".$errors."\n\r"; 
} 
?> 

// Results: 4 (2 errors for each "α") 

這是一個$字符的var_dump:

string(1) "a" 
string(1) "a" 
string(1) "�" 
string(1) "�" 
string(1) "�" 
string(1) "�" 
+2

代替'strlen',使用'mb_strlen($ string,'UTF8')',我想你還需要'mb_substr'。它是否解決了您的問題?你試過什麼樣的正則表達式?如果您對正則表達式感興趣,請分享。 –

+1

你究竟需要什麼?檢查字符串中的所有字符是否包含在「valid_chars」中的函數? – Amarnasan

+0

不知道,但看看[這個片段](https://ideone.com/RQ9JjC)。這是你在找什麼? –

回答

1

您需要使用mb_strlenmb_substr與UTF8編碼正確計算數量Unicode字符:

for($i = 0; $i < mb_strlen($string, 'UTF8'); $i++) { // <--- HERE 
    $char = mb_substr($string, $i, 1, 'UTF8');   // AND HERE ---> 
    if (!in_array($char, $valid_chars)) { $errors++; } 
} 

IDEONE demo

其實你也可以matc h Unicode字形與preg_match_all('/\X/u', $str, $matches),其中\X is a shorthand class for a Unicode grapheme

+0

@Realist:請讓我知道你是否需要更多的說明。 –