Php 使用备用字符变量进行字符串比较

Php 使用备用字符变量进行字符串比较,php,regex,string,comparison,preg-match,Php,Regex,String,Comparison,Preg Match,正确的问题…用户需要输入特定的文本输入文本是序列号,此输入必须与数据库进行比较。然而,由于字体太小,用户会在诸如:B/8、1/l、0、o、u、v等字符之间犯错误 问题是当序列号为12348时,如何使用户输入l234B成为有效条目 下面是另一个示例:o12u3-->012v3 谢谢。您可能希望尝试使用函数,而不是使用正则表达式,并且只验证非歧义字符。一些解决方案可能是用[8B]替换所有OCcorence,如8,以匹配这两种可能性: $sn = "l234B"; $sn_new = ""; $pro

正确的问题…用户需要输入特定的文本输入文本是序列号,此输入必须与数据库进行比较。然而,由于字体太小,用户会在诸如:B/8、1/l、0、o、u、v等字符之间犯错误

问题是当序列号为12348时,如何使用户输入l234B成为有效条目

下面是另一个示例:o12u3-->012v3


谢谢。

您可能希望尝试使用函数,而不是使用正则表达式,并且只验证非歧义字符。

一些解决方案可能是用[8B]替换所有OCcorence,如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了,但我想你已经明白了

// 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,你必须查询它们。因此,您必须在所有可能的组合中替换模糊字符并查询这些字符


这就是为什么序列号不应该包含不明确的字符。最好首先通过限制序列号的字符集来避免引入问题。当然,不要打印太小的序列号,至少要使用易于识别的字体。也许不明显但更简单的答案是打印得更大。我怀疑他是否负责生成或打印序列号:谢谢,这很好,但序列号可能属于错误的产品,并且仍然显示可接受的相似性百分比。