2015-09-18 118 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:请让我知道你是否需要更多的说明。 –