php | anagram求解器通过woldcard查找不在原始搜索中的字母

时间:2013-06-30 06:10:09

标签: php anagram

我有一个查询,我想要做的是当用户搜索我的anagram解算器时,他们可能会输入一个通配符作为?在搜索栏中。

<input type="text" name="l">

让我们说用户输入“tes?”

我的查询将找到它可以用这些字母包括1个通配符以及

创建的每个单词
SELECT `word`, 0+IF(`a` > 0, `a` - 0, 0)+IF(`b` > 0, `b` - 0, 0)+IF(`c` > 0, `c` - 0, 0)+IF(`d` > 0, `d` - 0, 0)+IF(`e` > 1, `e` - 1, 0)+IF(`f` > 0, `f` - 0, 0)+IF(`g` > 0, `g` - 0, 0)+IF(`h` > 0, `h` - 0, 0)+IF(`i` > 0, `i` - 0, 0)+IF(`j` > 0, `j` - 0, 0)+IF(`k` > 0, `k` - 0, 0)+IF(`l` > 0, `l` - 0, 0)+IF(`m` > 0, `m` - 0, 0)+IF(`n` > 0, `n` - 0, 0)+IF(`o` > 0, `o` - 0, 0)+IF(`p` > 0, `p` - 0, 0)+IF(`q` > 0, `q` - 0, 0)+IF(`r` > 0, `r` - 0, 0)+IF(`s` > 1, `s` - 1, 0)+IF(`t` > 1, `t` - 1, 0)+IF(`u` > 0, `u` - 0, 0)+IF(`v` > 0, `v` - 0, 0)+IF(`w` > 0, `w` - 0, 0)+IF(`x` > 0, `x` - 0, 0)+IF(`y` > 0, `y` - 0, 0)+IF(`z` > 0, `z` - 0, 0) AS difference FROM `TWL06` WHERE LENGTH(`word`) <= 4 HAVING difference <= 1 ORDER BY LENGTH(`word`) DESC

我的查询工作正常。我想要做的是基于它找到的单词我希望它改变它找到的单词中的字母颜色为蓝色,以通知用户这是通配符。

那么如果用户输入“tes?”结果将是“TEST”,我希望能够确定使用该字母的次数与原始搜索中输入的次数相比,然后将颜色更改为蓝色。所以它看起来像这样

TES<span style="color:#0000FF">T</span>

我正在尝试使用foreach循环来通过preg_match来确定这一点,但我似乎无法正确排列它。任何帮助,将不胜感激。以下是我的代码示例,原始搜索词与$ l关联为“TES?”

SELECT `word`, 0+IF(`a` > 0, `a` - 0, 0)+IF(`b` > 0, `b` - 0, 0)+IF(`c` > 0, `c` - 0, 0)+IF(`d` > 0, `d` - 0, 0)+IF(`e` > 1, `e` - 1, 0)+IF(`f` > 0, `f` - 0, 0)+IF(`g` > 0, `g` - 0, 0)+IF(`h` > 0, `h` - 0, 0)+IF(`i` > 0, `i` - 0, 0)+IF(`j` > 0, `j` - 0, 0)+IF(`k` > 0, `k` - 0, 0)+IF(`l` > 0, `l` - 0, 0)+IF(`m` > 0, `m` - 0, 0)+IF(`n` > 0, `n` - 0, 0)+IF(`o` > 0, `o` - 0, 0)+IF(`p` > 0, `p` - 0, 0)+IF(`q` > 0, `q` - 0, 0)+IF(`r` > 0, `r` - 0, 0)+IF(`s` > 1, `s` - 1, 0)+IF(`t` > 1, `t` - 1, 0)+IF(`u` > 0, `u` - 0, 0)+IF(`v` > 0, `v` - 0, 0)+IF(`w` > 0, `w` - 0, 0)+IF(`x` > 0, `x` - 0, 0)+IF(`y` > 0, `y` - 0, 0)+IF(`z` > 0, `z` - 0, 0) AS difference FROM `TWL06` WHERE LENGTH(`word`) <= 4 HAVING difference <= 1 ORDER BY LENGTH(`word`) DESC
$result = mysql_query($query);
while($row = mysql_fetch_array($result)) {
    $getvalues = str_split($row['word']);
    foreach($getvalues as $letter) {
        if (!preg_match('/'.$letter.'/',$l)) {
            $buildword = '<span style="color:#0000FF">'.$letter.'</span>';
        } else {
            $buildword = $letter;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的策略存在的一个问题是,“test”一词有两个ts,因此我决定将输入值分配给$temp(以防您需要使用$l在其他地方)并且每次发现一个字母减去它。如果用户输入“tes”,它将逐个删除这些字母,直到没有任何内容为止,并且“test”中的最终t显示为蓝色。

while($row = mysql_fetch_array($result)) {
    $getvalues = str_split($row['word']);
    $temp = $l;
    $buildword = '';
    foreach($getvalues as $letter) {
        $pos = strpos($temp, $letter);
        if ($pos === FALSE) {
            $buildword .= '<span style="color:#0000FF">'.$letter.'</span>';
        } else {
            if ($pos == 0){
                $temp = substr($temp, 1);
            } else {
                $first = substr($temp, 0, $pos);
                $temp = $first.substr($temp, $pos+1);
            }
            $buildword .= $letter;
        }
    }
}