【问题标题】:php | anagram solver to find letters not in original search through woldcardphp |字谜求解器通过 woldcard 查找不在原始搜索中的字母
【发布时间】:2013-06-27 14:00:37
【问题描述】:

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

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

【问题讨论】:

    标签: php anagram


    【解决方案1】:

    你的策略的一个问题是“测试”这个词有两个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;
            }
        }
    }
    

    【讨论】:

    • 它将所有字母突出显示为蓝色
    • 我不确定问题出在哪里,因为我测试过,它一次只突出显示一个字母。
    • 好的,这是因为我用大写字母来回显结果,使它们变低并且效果很好。非常感谢
    猜你喜欢
    • 2015-10-31
    • 2013-05-28
    • 2014-05-09
    • 2012-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多