这一点有点帮助,这是它的细节
[Products]
id int
name text
category
color
问题是色域的值,样本值是:
GOLDRED
GOLD-RED
GOLD/RED
BLUE/GREEN-RED
WHITE GOLD-YELLOW/ORANGE
我可以使用基本功能
清理搜索查询,例如此示例"select * from products where color=".cleanstring($stringval)." limit 1";
function cleanstring($var) {
$newtext = $var;
$newtext = preg_replace("/[^a-zA-Z0-9\s]/", "", $newtext);
$newtext = str_replace(" ", "", $newtext);
$newtext = strtoupper($newtext);
return $newtext;
}
问题在于内容。在使用命名约定时,它有数以千计的记录,没有任何形式的标准。
我想选择那些值与我的cleanstring()
类似的记录。
示例:
Query = GOLDRED
可以选择
GOLD-RED
GOLD RED
GOLDRED
GOLD/RED
GOLDRED
您可以推荐哪种解决方案?代码是PHP / MySQL。
答案 0 :(得分:0)
"select * from products where 1".cleanstring($stringval);
function cleanstring($var) {
$color_list = array('GOLD','RED','GREEN','WHITE');
$sql_where='';
foreach( $color_list AS $v){
if(strpos($var, $v)!==false){
$sql_where .=" AND color LIKE '%{$v}%'";
}
}
return $sql_where;
}
//select * from products where 1 OR color LIKE '%GOLD%' OR color LIKE '%RED%'
REMARK:
输入:GOLDRED,
匹配:GOLD RED,GOLD-RED,GOLD / RED ..... GOLD / RED / ABC,RED_GOLDGREEN,可能在获取所有数据之后,然后按匹配%进行func排名,如搜索引擎
答案 1 :(得分:0)
不是最好的方式,而且我确信有很多垮台,但如果我没有在PHP代码中犯任何错误(没有机器试试),它就可以完成工作:
"select * from products where color REGEXP '".cleanstring($stringval)."' limit 1";
function cleanstring($var) {
$var = preg_replace('![-\/ ]+!', '', $var);
$strLength = strlen($var);
$parts = array();
for ($i = 1; $i <= $strLength; i++) {
$parts[] = ($i > 0) ? substr($var, 0, $i).'[-/ ]?'.substr($var, $i);
}
return "[[:<:]](".implode('|', $parts).")[[:>:]]";
}
它会输出如下内容:
"select * from products where color REGEXP '[[:<:]](G[-/ ]?OLDRED|GO[-/ ]?LDRED|GOL[-/ ]?DRED|GOLD[-/ ]?RED|GOLDR[-/ ]?ED|GOLDRE[-/ ]?D)[[:>:]]' limit 1"
基本上会逐字逐句地破坏你的关键词,即
并对它们执行“LIKE”语句,但是使用更智能的单词边界而不仅仅是空格,它也会考虑“-
”和“/
”。
答案 2 :(得分:0)
可能你只能使用'GOLD.?RED'或'GOLD( - | [[space:]])制作一个MySQL正则表达式?RED'?
这是我做的在线示例:http://regexr.com?34mmg