PHP和mysql忽略数据库中存在的特殊字符

时间:2013-04-27 03:22:27

标签: php mysql sql regex

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

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

3 个答案:

答案 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"

基本上会逐字逐句地破坏你的关键词,即

  • G OLDRED
  • GO LDRED
  • GOL DRED
  • GOLD RED
  • GOLDR ED
  • GOLDRE D

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

答案 2 :(得分:0)

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

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