2013-04-27 77 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