2013-04-27 6 views
0

, 여기의 세부 사항PHP와 MySQL

[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

http://regexr.com?34mmg, 당신은 내가 그와 함께, 그 문제를 해봤'LIKE' 절 'LIKE'% GOLDRED % '' –

+0

시도가 그것을 가진 사람을 선택할 수 있다는 것입니다 하이픈과 슬래시 및 공백 – user2173176

+0

mysql의'soundex()'함수에 익숙하지 않지만 그것을 사용해 보았습니까? –

답변

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

비고

입력 : GOLDRED,

매치 : GOLD RED, GOLDRED, GOLD/RED ..... GOLD/RED/ABC, RED_GOLDGREEN,

모든 데이터를 가져온 후, 검색 엔진처럼 일치율로 func 순위를 매길 수 있습니다.

+0

입니다.이 Joe Lee를 확인하겠습니다. Joe Lee, 그냥 질문입니다. 코드를 확인해 봤습니까? $ sql_where에 오류가 있습니다. "AND color LIKE '% {$ v} %'"; – user2173176

+0

희망이 도움을 ..... –

+0

JOELEE, 코드 덕분에, 그 부분적으로 맞습니다. 주요 문제는 내용입니다. 색상 범위는 이보다 훨씬 복잡합니다. 일부는 색상 이름조차하지 않습니다. 색상 및 다른 값의 범위 때문에 $ color_list 배열에 필요한 모든 것을 제공 할 수 없습니다. – user2173176

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 드레드
  • RED GOLD
  • GOLDR ED
  • GOLDRE의 D

과 그들에 만에 문 "좋아요"를 할 똑똑한 단어 경계와 단지 공간 대신에, 그것은 "-"과 "/ "도 있습니다.

0

아마도 'GOLD.RED'또는 'GOLD (- | [[: space :]])? RED'로 MySQL 정규 표현식을 만들 수 있습니까?

내가 만든 온라인 예제

: