【问题标题】:PHP and mysql Ignoring the special chracters present in the databasePHP 和 mysql 忽略数据库中存在的特殊字符
【发布时间】:2013-04-21 07:26:22
【问题描述】:

对这个有一点帮助,这里是它的详细信息

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

【问题讨论】:

  • 你试过LIKE子句LIKE '%GOLDRED%'
  • 我试过了,问题是它无法选择带有连字符、斜线和空格的那些。
  • 对mysql中的soundex()函数不是很熟悉,但是你试过了吗?
  • 没试过soundex(),我查过soundex,它看起来很有趣,但有点不同。
  • 您必须使用颜色列表才能获得 GOLDRED 或其他单词的断点,请参阅我的回答

标签: php mysql sql regex


【解决方案1】:
"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%' 

备注:

输入:GOLDRED,

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

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

【讨论】:

  • 我会检查一下这个 Joe Lee。 Joe Lee,只是一个问题,你检查过代码吗? $sql_where " AND color LIKE '%{$v}%'" 有错误;
  • JOELEE,感谢您的代码,它部分正确。主要问题在于内容。颜色范围比这复杂得多。有些甚至没有颜色名称。由于颜色和其他值的范围,我不可能提供 $color_list 数组所需的所有内容。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    不是最好的方法,而且我肯定有很多缺点,但是如果我没有在 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
    • GOL DRED
    • 金红
    • GOLDR ED
    • GOLDRE D

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

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2018-04-18
      • 2013-12-11
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      相关资源
      最近更新 更多