与备用字符变量的字符串比较

时间:2011-07-15 08:23:17

标签: php regex string comparison preg-match

问题的权利...用户需要输入文本(具体来说输入文本是序列号),此输入必须与数据库进行比较。但是由于小字体,用户会在如下字符之间出错:(B / 8),(1 / l),(0,o),(u,v)。

问题是当序列号为“12348”时,如何让用户输入“l234B”作为有效条目?

这是另一个例子:o12u3 ---> 012v3

感谢。

3 个答案:

答案 0 :(得分:0)

您可能想尝试使用similar_text函数,而不是使用正则表达式,只验证非模糊字符。

答案 1 :(得分:0)

某些解决方案可能是将“[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,但我认为你明白了。

答案 2 :(得分: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()