Word Finder正则表达式,PHP& MySQL的

时间:2011-05-22 23:22:58

标签: php mysql

我有一个查询,我正在尝试针对单词数据库运行。查询必须返回包含另一个单词和给定字母的单词。它在PHP和mySQL中。

例如:

Word Given: Cruel
Letters Given: abcdty

在数据库中,我需要根据给出的字母和给定的单词找到“残忍”一词。它需要双向工作。因此,如果我有“atni”字母,如果它存在于数据库中,就会出现“Anticruel”。

我有一半工作,但给出的结果不正确:

SELECT word
FROM words
WHERE LOCATE(  "cruel", word ) >0
AND word !=  "cruel"
AND word
REGEXP  '[ybilteh]'

此查询的结果集:

"anticruelty"
"crueler"
"cruelest"
"crueller"
"cruellest"
"cruelly"
"cruelness"
"cruelnesses"
"cruelties"
"cruelty"

更新!!!

感谢Benjamin Morel,这已经越来越近了。

此查询:

SELECT word
FROM words
WHERE LOCATE(  "t", word ) >0
AND word !=  "t"
AND word
REGEXP  '^[ybilteh]*t[ybilteh]*$'
LIMIT 0 , 30

正确查找单词。但也包括双字母的单词。如“甜菜”。只有1“e”时可用。

1 个答案:

答案 0 :(得分:1)

试试这个:

SELECT word
FROM words
WHERE word REGEXP '^[ybilteh]*cruel[ybilteh]*$'
AND word != 'cruel';

更新:让我们用PHP进行改进,这是怎么回事?

$word = 'cruel';
$letters = 'ybilteh';

$items = array("anticruelty", "crueler", "cruelest",
    "crueller", "cruellest", "cruelly", "cruelness",
    "cruelnesses", "cruelties", "cruelty");

$letters = str_split($letters);
foreach ($items as $item) {
    $list = $letters;
    // remove the original word (once)
    $thisItem = preg_replace("/$word/", '', $item, 1); 
    for ($i=0; $i<strlen($thisItem); $i++) {
        $index = array_search($thisItem[$i], $list);
        if ($index === false) {
            continue 2; // letter not available
        }
        unset($list[$index]); // remove the letter from the list
    }
    echo "$item\n"; // passed!
}

返回:残忍,残忍

您可能会找到更好/更简单的方法,但这应该可以做到!