2011-07-15 15 views
1

問題が...ユーザーがテキストを入力する必要があります(具体的には入力テキストはシリアル番号です)。この入力はデータベースと比較する必要があります。しかし、小さな印刷ユーザーのために、(B/8)、(1/l)、(0、o)、(u、v)のような文字の間違いが発生します。代替文字変数との文字列比較

問題は、シリアル番号が「12348」のときに、ユーザー入力「l234B」を有効なエントリにする方法です。 o12u3 ---> 012v3

感謝:ここ

は別の例です。

+4

これは、シリアル番号にあいまいな文字が含まれないようにする理由です。シリアル番号が構成されている文字のセットを制限することで、まずは問題の導入を避ける方がよいでしょう。 もちろん、シリアル番号は判読不能に小さく印刷しないでください(少なくとも、これらの文字は区別しやすいフォントを使用してください)。 –

+0

おそらく明白ではないが簡単な答えは、プリントを大きくすることです。 –

+0

私は彼が彼の生成や印刷を担当しているのではないかと思っています:) –

答えて

0

$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正規表現を使用するのではなく、あいまいでない文字のみを検証するのではなく、機能を試してみるとよいでしょう。

いくつかのソリューションは、両方の可能性にマッチさせる「[8B]」で「8」のように、すべてのoccorencesを交換するかもしれない
+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); 
} 

最適な解決方法は、特定の設定によって異なります。おそらくあなたはIDをどこかに持っていて、それらを照会する必要があります。すべての可能な組み合わせであいまいな文字を置き換えてクエリする必要があります。

strtr()