问题来了…用户需要输入文本(具体的输入文本是序列号),这个输入必须与数据库进行比较。然而,由于字体小,用户会在字符之间犯错误,如:(B/8), (1/l),(0,o),(u,v)。
问题是当序列号为"12348"时,如何使用户输入"l234B"成为有效条目??
这里是另一个例子:o12u3 -> 012v3
谢谢。
一些解决方案可能是用"[8B]]"替换所有像"8"这样的出现,以匹配这两种可能性:
$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很长时间了,但我想你明白了。
您可以尝试使用similar_text函数,而不是使用正则表达式,并且只验证非二义字符。
// 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 ()