我想创建一个产品搜索引擎,用户在产品代码中输入内容,然后将结果带回来,这很容易。
但是,我希望能够弥补看起来像字母的数字,反之亦然。
例如,用户键入6O12l,但产品代码实际为60121。
我需要在SQL查询中放入什么来带回所有6O12l和/或60121的产品?
到目前为止,我有这个不起作用,无论我输入什么内容,它每次都会带回相同的结果:
$searchString = $_POST['query'] ;
$searchString = preg_replace('#\W#', '', $searchString);
$firstLetter = substr($searchString, 0, 1) ;
include("db.php") ;
$result = $dbh->prepare("SELECT productCode
FROM products
WHERE productCodeREGEXP '6[O0]12[1l]'
AND productCode LIKE '$firstLetter%'") ;
$result->execute() ;
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
echo $row['productCode'].'<br />' ;
}
我设法让它工作,但我遇到了一个新问题。
我正在使用str_replace将字母替换为用户查询字符串中的数字和反之字符,但它只适用于其中一个,而不是两个:
$qString = str_replace(array('o', 'l', '0', '1'), array('[O0]', '[1l]', '[O0]', '[1l]'), $searchString) ;
这给了我一个例如A [[1升] 1] BC 而不是A [1l] BC
答案 0 :(得分:1)
使用此:
SELECT * from products
where code REGEXP '6[O0]12[1l]'
答案 1 :(得分:1)
您是否有带字母的产品代码?您可以在运行查询之前将查询字符串转换为所有数字。这是最简单的事情,并且比测试两者都要快得多。
答案 2 :(得分:1)
您无法使用正则表达式有效地搜索数据库。但是,您可以以标准化形式转换数据以进行存储,并使用标准化查询字符串进行搜索,例如所有O
为零,I
和l
为1,依此类推。
答案 3 :(得分:0)
我解决了它:D
作为参考,我在PHP.net上找到了这个函数:
function search_replace($s,$r,$sql)
{ $e = '/('.implode('|',array_map('preg_quote', $s)).')/';
$r = array_combine($s,$r);
return preg_replace_callback($e, function($v) use ($s,$r) { return $r[$v[1]]; },$sql);
}
答案 4 :(得分:0)
另一个选择
// regex expresssion
// str_replace goes in order, first change letters to numbers, then change to the regex
// 6012ol becomes 6[0O][1l]2[0O][1l]
$regexString = str_replace(array('o', 'l', '0', '1'), array('0', '1', '[0O]', '[1l]'), $searchString);
// like expression, allows the database to make the initial filter, _ is the single character match
// 6012ol becomes 6__2__
$likeString = str_replace(array('o', 'l', '0', '1'), '_'), $searchString);
$filt1 = "(productCode LIKE '$likeString%')"; // last % allows for partial matches
$filt2 = "(productCode REGEXP '$regexString')";
// now query, with the like filter first
$dbh->prepare("SELECT productCode
FROM products
WHERE $filt1 AND $filt2
") ;