2013-04-27 74 views
0

在这一个小的帮助,这里有它的细节PHP和MySQL忽略存在于数据库中的特殊chracters

[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

你试过'LIKE'条款'LIKE“%GOLDRED%”' – 2013-04-27 03:31:44

+0

我已经试过了,问题就这样,就是它不能选择那些超过和斜线和空格。 – user2173176 2013-04-27 03:38:29

+0

不是很熟悉mysql中的'soundex()'函数,但是你试过了吗? – 2013-04-27 03:42:41

回答

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,GOLDRED,GOLD/RED ..... GOLD/RED/ABC,RED_GOLDGREEN,

可能是得到所有数据后,然后按匹配百分比进行func排名,就像搜索引擎

+0

我会检查此Joe Lee。乔李,只是一个问题,你检查了代码。 $ sql_where中有错误“AND color LIKE'%{$ v}%'”; – user2173176 2013-04-27 04:02:53

+0

希望这个帮助..... – 2013-04-27 04:04:57

+0

JOELEE,感谢代码,它的一部分是正确的。主要问题是内容。颜色范围比这更复杂。有些甚至没有颜色名称。由于颜色和其他值的范围,我不可能为$ color_list数组提供所有必需的东西。 – user2173176 2013-04-27 04:10:48

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" 

通过信函,基本上打破了你的关键字段信,即

  • 摹OLDRED
  • GO LDRED
  • GOL DRED
  • 枚红
  • GOLDR ED
  • GOLDRE d

,并做了 “喜欢” 上他们,但有说法更智能的单词边界,而不仅仅是空间,它认为“-”和“/“。

0

也许你可以用'GOLD.?RED'或'GOLD( - | [[:space:]])'RED'来做一个MySQL正则表达式?

这是我做了一个在线的例子:http://regexr.com?34mmg