Сравнение строк с переменными символьных переменных - PullRequest
1 голос
/ 15 июля 2011

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

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

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

спасибо.

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

Некоторым решением может быть замена всех вхождений, таких как "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 голосов
/ 15 июля 2011
// 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 ()

0 голосов
/ 15 июля 2011

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

...