2011-07-15 5 views
1

Право на проблему ... пользователю необходимо вводить текст (конкретный текст ввода - это серийный номер), этот вход необходимо сравнивать с базой данных. Однако из-за небольшого пользователя печати ошибка между такими символами, как: (B/8), (1/l), (0, o), (u, v).Сравнение строк с альтернативными переменными символов

Вопрос в том, как сделать вход пользователя «l234B» допустимым, когда серийный номер «12348» ??

вот еще примеры: o12u3 ---> 012v3

спасибо.

+4

Поэтому серийные номера не должны содержать неоднозначные символы. Лучше избегать введения проблемы в первую очередь, ограничивая набор символов, из которых построен серийный номер. И, конечно, не печатайте серийные номера, которые нечитабельно малы (по крайней мере, используйте шрифт, где эти символы легко различимы). –

+0

Возможно, неочевидный, но более простой ответ - сделать печать большей. –

+0

Я сомневаюсь, что он отвечает за их создание или печать :) –

ответ

0

Некоторые из решений могло бы заменить все occorences как «8» на «[8B]», чтобы соответствовать против обеих возможностей:

$sn = "l234B"; $sn_new = ""; 
$problematic_chars = ['B' => 'B8', '8' => 'B8', '1' => '1l', 'l' => '1l', ...]; 

// Go through original string and create new string 
// "l234B" becomes "[1l]234[8B]" 
for($i = 0; $i < strlen($sn); $i++) { 
    $char = $sn[$i]; 
    if (array_key_exists($char, $problematic_chars)) { 
     $sn_new .= "[".$problematic_chars[$char]."]"; 
    } else { 
     $sn_new .= $char; 
    } 
} 

// Query stuff 
$sql = "SELECT * FROM table_name WHERE sn REGEXP '^${sn_new}\$'"; 

Не писал PHP в течение длительного времени, но я думаю, вы получите идею ,

+0

Спасибо, это имеет очень хороший смысл. –

0

Возможно, вы захотите попробовать функцию similar_text, а не использовать регулярные выражения и проверить только не двусмысленные символы.

+0

Спасибо, это хорошо, но серийный номер может принадлежать неправильному продукту и по-прежнему показывает приемлемый процент сходства. –

0
// to query 
$id = "ABF8..."; 

// all combinations pre-generated 
$c = array(
    array('B' => 'B', '8' => '8', ...), 
    array('B' => 'B', '8' => 'B', ...), 
    array('B' => '8', '8' => '8', ...), 
    array('B' => '8', '8' => 'B', ...), 
    ... 
); 

// generating all versions 
foreach($c as $v) 
{ 
    $ids[] = strtr($id, $v); 
} 

оптимальное решение зависит от конкретной настройки. но, вероятно, у вас будут идентификаторы где-то, и вы должны их запросить. поэтому вам придется заменить неоднозначные символы во всех возможных комбинациях и запросить их.

strtr()

Смежные вопросы