0

我有一个这样的查询,我想做的是当用户搜索我的字谜求解器时,他们可能会输入一个通配符作为?在搜索字段中。

<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;
        }
    }
}
4

1 回答 1

1

你的策略的一个问题是“test”这个词有两个ts,所以我决定将输入值分配给$temp(以防万一你需要在$l其他地方使用)并且每次找到一个字母时减去它。如果用户输入“tes”,它将一个一个地删除这些字母,直到什么都没有,并且t“test”中的最后一个显示为蓝色。

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;
        }
    }
}
于 2013-06-30T06:50:09.197 回答