【问题标题】:Word Finder regular expression, PHP & mySQLWord Finder 正则表达式、PHP 和 mySQL
【发布时间】:2011-05-24 23:13:25
【问题描述】:

我有一个查询,我正在尝试针对单词数据库运行。查询必须返回一个包含另一个单词和给定字母的单词。它在 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"

更新!!!

感谢本杰明·莫雷尔,这离我们越来越近了。

这个查询:

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

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

【问题讨论】:

  • 你在做一个类似拼字游戏的游戏吗?
  • 也许吧?还没做完。但它来了。
  • 该解决方案仅使用纯 MySQL 非常复杂,是否可以选择使用 MySQL 过滤最简单的部分并使用 PHP 过滤其余部分?
  • @Alix - 绝对。我只需要它工作。

标签: php mysql


【解决方案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!
}

回报:残忍,残忍

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

【讨论】:

  • 效果很好,但现在我遇到了这个问题。因为当一个词只是一个字母时。例如:单词:T 字母:ybilteh 返回单词 BEET(双 e)
  • 你的意思是每个字母只能出现一次?
  • 不,它只是匹配给定字母的数量。当仅存在 1 个“E”时,它返回 BEET。我意识到正则表达式不能做[ee]。需要找出一个远离它的地方
  • 我想不出任何方法可以用 MySQL 做到这一点,正如上面 Alix 所建议的那样,您可能想使用 MySQL 查询(这个)来获取原始列表,然后用PHP.
  • 太棒了。我有类似的东西,但这看起来更干净一些。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2014-05-28
  • 2021-09-20
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多