【问题标题】:add [and] + [or ] to search filter for a foreach generated list添加 [and] + [or ] 以搜索过滤器以查找 foreach 生成的列表
【发布时间】:2016-11-26 14:42:00
【问题描述】:

所以我已经有了一个搜索过滤器,但现在我希望它能够combine 搜索短语。下面是在页面上生成列表的代码。

<div class="sortable2">
  <ul class="connectedSortable links loadfiles" id="loadfiles">
    <?php
      foreach ($result as $value) {
        list($classname, $origin, $name) = explode('_', $value);
        $classname = trim($classname, '[]');
        $origin    = trim($origin, '[]');
        $name      = pathinfo($name, PATHINFO_FILENAME);
        echo "<li class='audiofile " . $name . " " . $classname . "' id='" . $value . "'>".
                "<a class='btn_clone fa fa-clone' aria-hidden='true' id='' onclick='repeat(event)' title='Clone'>&nbsp;</a>".
                "<a class='btn_addto fa fa-arrow-up' aria-hidden='true' id='' onclick='addto(event)' title='Add to playlist'>&nbsp;</a>".
                "<a class='btn_removefrom fa fa-trash' aria-hidden='true' id='' onclick='removefrom(event)' title='Remove element'>&nbsp;</a>".
                "<span class='audioclass'>" . $classname . "</span>".
                "<a href='" . $directoryname . "/" . $value . "' target='_blank'>".
                  "<img src='images/avatars/" . $classname . ".jpg'>".
                  "<div class='audiotext'>".
                    "<span class='audiotitle'>" . $name . "</span>".
                    "<span class='audioorigin'>" . $origin .  "</span>".
                  "</div>".
                "</a>".
              "</li>";
      }
    ?>
  </ul>

</div>

这个列表基本上会生成如下块:

frank
hello how are you
link to audio file

william
i am fine
link to audio file

frank
what?
link to audio file

过滤是通过这段代码完成的

$('#global_filter').keyup(function() {
    var col_name = $(this).attr('class');
    var search_val = $(this).val().toLowerCase();
    $('.' + col_name).closest('#loadfiles > li').css('display', 'none');
    $('.' + col_name).each(function() {
        var val = $(this).text();
        console.log($(this).text(), 'text');
        if(val.toLowerCase().indexOf(search_val) >= 0) {
            $(this).closest('#loadfiles > li').css('display', 'block');
        }
    });
});

配合使用

<div class="input">
  <h4>Search field</h4>
  <div class="all_all" id="filter_global">
    <div align="left"><input type="text" name="global_filter" id="global_filter" class="audiofile"></div>
    <div align="left"><input type="checkbox" name="global_regex"  id="global_regex" ></div>
    <div align="left"><input type="checkbox" name="global_smart"  id="global_smart"  checked></div>
  </div>
</div>

问题

如何更改过滤器以允许使用 [AND][OR] (如果可能)进行多个搜索短语。所以用户可以输入例如:

frank [and] hello

然后这将返回

frank
hello how are you
link to audio file

【问题讨论】:

    标签: php search foreach filtering


    【解决方案1】:

    虽然这个项目似乎已经有一段时间没有更新了,但您可能可以利用其中的一部分来满足您的需求:https://github.com/bloomtime/boolean-expression-js

    $('#global_filter').keyup(function() {
    
        // Init
        var col_name = $(this).attr('class');
        var search_val = $(this).val().toLowerCase();
    
        // Setup boolean expression
        var parsed = new Expression(search_val);
    
        $('.' + col_name).closest('#loadfiles > li').css('display', 'none');
        $('.' + col_name).each(function() {
            var val = $(this).text();
            if(parsed.test(val) == true) {
                $(this).closest('#loadfiles > li').css('display', 'block');
            }
        });
    });
    

    它在幕后利用ReParse 能够根据预定义的语法拆分您的搜索,然后进行匹配测试。

    编辑


    如果您真的想保持超级简单,它可能不是非常灵活,但您可以尝试这种方法。这基本上可以使用[AND][OR] 进行搜索,但不能同时使用两者。可能会使用一些重构,因为我只是快速将其整理出来。

    $('#global_filter').keyup(function() {
    
        // Init
        var col_name = $(this).attr('class');
        var search_val = $(this).val().toLowerCase();
        var columns = $('.' + col_name);
    
        // If doing a boolean AND
        if (search_val.toLowerCase().indexOf('[and]') >= 0) {
            // Get search parts
            var parts = search_val.split('[and]');
            $(columns).each(function(columnIndex, column) {
                var val = $(column).text();
                var matched = true;
                $(parts).each(function(partIndex, part) {
                    // Since AND is inclusive, failing to match should assume this column is a non-match
                    if (val.toLowerCase().indexOf(part.toLowerCase()) < 0) {
                        matched = false;
                        // Break early
                        return false;
                    }
                });
                if (matched) {
                    $(column).closest('#loadfiles > li').css('display', 'block');
                }
            });
        }
    
        // If doing a boolean OR
        else if (search_val.toLowerCase().indexOf('[or]') >= 0) {
            // Get search parts
            var parts = search_val.split('[or]');
            $(columns).each(function(columnIndex, column) {
                var val = $(column).text();
                var matched = false;
                $(parts).each(function(partIndex, part) {
                    // With OR, if ANY of the parts match then it is a match
                    if (val.toLowerCase().indexOf(part.toLowerCase()) >= 0) {
                        matched = true;
                        // Break early
                        return false;
                    }
                });
                if (matched) {
                    $(column).closest('#loadfiles > li').css('display', 'block');
                }
            });
        } else {
            var val = $(this).text();
            if(val.toLowerCase().indexOf(search_val) >= 0) {
                $(column).closest('#loadfiles > li').css('display', 'block');
             }
        }
    });
    

    【讨论】:

    • 谢谢,但我更想在现有代码中找到一种方法,无需加载另一个库或 js 文件。
    • 问题是对字符串进行标记,对这些标记进行布尔匹配是相当复杂的,而且真的不是一个小的sn-p代码。话虽如此,让我看看我是否可以添加您可以尝试的“hack”。
    • 那真是太酷了。感谢您提供的帮助和建议。非常感谢。
    • 我试过你的编辑。可悲的是,它不起作用,也没有显示错误。我尝试输入一个单词,以及 [AND] 和 [OR],但三个都没有任何反应。我用已经存在的代码替换您的代码是否正确。
    • 糟糕,我在“[OR]”部分中留下了“[AND]”。另外,我只是将其设置为 else/if 条件,因此只有一个运行。这完全不在我的脑海中,您可能必须自己进行调试——这只是为了让您找到一个方向。
    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多