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

San*_*nda 22 forms get query-string

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

例如:

aaa : foo
bbb : ____
ccc : bar
ddd : ____
Run Code Online (Sandbox Code Playgroud)

我想要这个查询字符串:

/?aaa=foo&ccc=bar
Run Code Online (Sandbox Code Playgroud)

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

/?aaa=foo&bbb=&ccc=bar&ddd=
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Rap*_*hDG 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>
Run Code Online (Sandbox Code Playgroud)

  • 只是对此的后续行动,看到它的旧和谷歌将永远存在。用户通常最好使用 $("#bbb").attr("disabled", "disabled"); (2认同)
  • 最好的想法是在提交时删除空字段的 `name` 属性,并在字段变为非空时将它们重新打开。 (2认同)

小智 6

我喜欢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>
Run Code Online (Sandbox Code Playgroud)

再次感谢您的想法RaphDG(y)

  • 如何修改它以删除所有没有值的键,而不仅仅是#bbb这样的特定键? (2认同)

Hob*_*bes 5

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

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

...这将使这个..;

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)。让我们分解一下;

    • ^(.*)- ^符号表示这是查询字符串的开始,并且句.点表示任何字符。星号*是句点通配符的修饰符,表示范围中应包括任意数量的通配符。
    • (&|\?)[a-z-_]+=(?=&|$)-这是最有趣的部分(如果您喜欢这种东西...)。这将找到您的空查询字符串。在第一个括号之间,我们要指出字符串以“&”或文字问号开头(在这种情况下,反斜杠使后面的字符成为文字,否则问号具有不同的含义)。在方括号之间,我们说匹配az或OR连字符-或下划线中的任何字符_,然后紧接着加号+表示我们应匹配任何一个以上字符1次或更多次。等号=就是它的样子(查询字符串名称及其值之间的等号)。最后,在下一个括号之间,我们有一个lookahead子句?=指出下一个字符必须是“&”号或该行的结尾,如美元符号所示$。这样做的目的是,仅当查询字符串后跟另一个查询字符串的开头或行末尾而不包含值时,才将其视为匹配项。
    • 最后的位(.*)$ [NC]仅与空查询字符串后的任何和所有内容匹配,该[NC]子句意味着这是正确的。
  3. RewriteRule .* \/formpage?%1%2 [R,L,NE]在这里,我们告诉mod_rewrite如何处理匹配的内容。本质上,将URL重写为您的页面名称,然后是整个查询字符串匹配的空字符串除外)。因为这将循环遍历您的URL,直到不再找到匹配项为止,因此,无论您有一个空值还是50,都没有关系。应该将它们全部识别出来,只保留使用值提交的参数。[NE]重写规则中的子句表示字符将不会进行URL编码-如果您期望使用特殊字符,这可能对您有用,也可能对您没有用(但是显然,在处理$ _GET数据时,您需要对其进行消毒,无论如何都应该这样做)。

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

希望对某人有用。


Kat*_*rax 5

使用 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) : '');
});
Run Code Online (Sandbox Code Playgroud)

说明:

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

另请参阅此解决方案