如何从查询字符串中的表单中删除空字段?

时间:2011-05-08 09:39:26

标签: forms get query-string

我有一个带有四个输入的简单表格。当我提交表单时,我想使用GET http方法。

例如:

aaa : foo
bbb : ____
ccc : bar
ddd : ____

我想要这个查询字符串:

/?aaa=foo&ccc=bar

问题是我有这个查询字符串:

/?aaa=foo&bbb=&ccc=bar&ddd=

如何从查询字符串中的表单中删除空字段?

感谢。

6 个答案:

答案 0 :(得分:13)

您可以使用jQuery的提交功能来验证/更改您的表单:

<form method="get" id="form1">
    <input type="text" name="aaa" id="aaa" /> 
    <input type="text" name="bbb" id="bbb" /> 
    <input type="submit" value="Go" />
</form>
<script type="text/javascript">
    $(document).ready(function() {
        $("#form1").submit(function() {
            if($("#bbb").val()=="") {
                    $("#bbb").remove();
            }
        });
     });
</script>

答案 1 :(得分:5)

我喜欢RaphDG

给出的想法

但我稍微修改了一下代码。我只是使用disabled属性而不是删除字段。 这是更改后的代码:

<form method="get" id="form1">
    <input type="text" name="aaa" id="aaa" /> 
    <input type="text" name="bbb" id="bbb" /> 
    <input type="submit" value="Go" />
</form>
<script type="text/javascript">
    $(document).ready(function() {
        $("#form1").submit(function() {
            if($("#bbb").val()=="") {
                    $("#bbb").prop('disabled', true);
            }
        });
     });
</script>

再次感谢RaphDG(y)

这个想法

答案 2 :(得分:5)

当前的解决方案依赖于运行Javascript / jQuery的客户端 - 这是无法保证的。另一种选择是使用重写规则。在Apache服务器上,我使用了以下内容来从表单提交中删除空的$ _GET值;

RewriteCond %{REQUEST_URI} \/formpage\/?
RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]
RewriteRule .* \/formpage?%1%2 [R,L,NE]

......这会改变这个......;

  

http://www.yoursite.com/formpage?search=staff&year=&firstname=&surname=smith&area=

......进入这个;

  

http://www.yoursite.com/formpage?search=staff&surname=smith

快速解释:

  1. RewriteCond %{REQUEST_URI} \/formpage\/?是一种将正则表达式的范围限制在网站地址的特定子页面的方法(例如http://www.yoursite.com/formpage)。它并非严格要求,但您可能希望仅将表达式应用于表单所在的页面。这是实现这一目标的一种方式。

  2. RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]是第二个条件,然后与查询字符串匹配(即从问号中显示(或包括)问号的任何内容,例如?firstname=sam$surname=smith)。让我们分解一下;

    • ^(.*) - ^符号表示这是查询字符串的START,句点.表示任意字符。星号*是针对期间通配符的修饰符,表示其中任何数量都应包含在范围内。
    • (&|\?)[a-z-_]+=(?=&|$) - 这是最有趣的一点(如果你喜欢这种东西......)。这会找到您的空查询字符串。在第一个括号之间,我们说明字符串以&符号或文字问号开头(反斜杠使得后面的字符文字,在这种情况下 - 否则问号具有不同的含义)。在方括号之间,我们说匹配来自az,或连字符-或下划线_的任何字符,然后立即加号+表明我们应该匹配任何前面的字符中的任何一个或多次。等号=就是它的样子(查询字符串名称与其值之间的等于)。最后,在下一个括号之间,我们有一个超前条款?=,它表明下一个字符必须是&符号或行的最后一行,如美元符号$所示。这里的意图是,如果查询字符串后面跟着另一个查询字符串的开头或行没有包含值,那么它将被视为匹配。
    • 最后一位(.*)$ [NC]只是匹配空查询字符串后面的所有内容,而[NC]子句意味着这是cASe iNsENsiTIve。
  3. RewriteRule .* \/formpage?%1%2 [R,L,NE]是我们告诉mod_rewrite如何处理匹配内容的地方。基本上将URL重写为您的页面名称,遵循整个查询字符串,除了匹配的空字符串。因为这将循环遍历您的URL,直到它停止找到匹配项为止,如果您有一个空值或50,则无关紧要。它应该发现它们并且仅保留使用值提交的参数。重写规则中的[NE]子句意味着字符将进行URL编码 - 如果您期待特殊字符,这可能对您有用,也可能没有用(但您显然需要清理$ _GET数据,当你进行处理时,无论如何都应该这样做。)

  4. 再次 - 这显然是使用mod_rewrite的Apache解决方案。如果您在其他操作系统(例如Windows服务器)上运行,则需要相应地进行调整。

    希望对某人有用。

答案 3 :(得分:2)

使用JQuery:

$('#form').submit(function (e) {
  e.preventDefault();

  var query = $(this).serializeArray().filter(function (i) {
    return i.value;
  });

   window.location.href = $(this).attr('action') + (query ? '?' + $.param(query) : '');
});

说明:

  • .submit()挂接到表单的submit事件
  • e.preventDefault()阻止表单提交
  • .serializeArray()为我们提供了将要发送的查询字符串的数组表示形式。
  • .filter()删除该数组中的虚假(包括空)值。
  • $.param(query)创建更新后的数组的序列化且符合URL的表示形式
  • 将值设置为window.location.href发送请求

另请参阅this solution

答案 4 :(得分:1)

使用jQuery:

$('form[method="get"]').submit(function(){
    $(this).find(':input').each(function() {
        var inp = $(this);
        if (!inp.val()) {
            inp.remove();
        }
    });
});

我用它从我网站上的所有GET表单中删除所有空参数。 :input伪选择器涵盖所有输入,textareas,选择和按钮。

答案 5 :(得分:0)

如果要删除所有所有空输入,可以遍历如下形式的表单输入:

<script type="text/javascript">
    $(document).ready(function() {
        $("#form1").submit(function() {
          $(this).find('input').each(function() {
            if($(this).val() == '') {
              $(this).remove();
            }
          });
        });
     });
</script>