0

对这个有一点帮助,这里是它的细节

[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 中。

4

3 回答 3

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%' 

评论:

输入:金红,

匹配: GOLD RED,GOLD-RED,GOLD/RED..... GOLD/RED/ABC,RED_GOLDGREEN,

可能是在获取所有数据后,然后按匹配百分比进行func排名,如搜索引擎

于 2013-04-27T03:46:06.707 回答
0

可能你可以只用 'GOLD.?RED' 或 'GOLD(-|[[:space:]])?RED' 创建一个 MySQL 正则表达式?

这是我制作的在线示例:http ://regexr.com?34mmg

于 2013-04-27T12:43:43.440 回答
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"

这基本上会逐个字母地破坏您的关键字,即

  • 金红
  • 去 LDRED
  • 戈尔德雷德
  • 金红色
  • 金牌教育
  • 戈尔德 D

并对它们执行“LIKE”语句,但使用更智能的单词边界,而不仅仅是空格,它还考虑“ -”和“ /”。

于 2013-04-27T04:07:21.193 回答