提交表单时从URL中删除%5B%5D

时间:2013-01-04 16:22:41

标签: php html forms rewrite

当我提交一个包含多个具有相同名称的复选框的表单时,我会得到一个如下所示的URL: www.mysite.com/search.php?myvalue%5B%5D=value1&myvalue%5B%5D=value2

有没有我可以删除%5B%5D以使URL“漂亮”,像htaccess这样的东西?

代码:

<form>
     <input type="checkbox" name="myvalue[]" value="value1">
     <input type="checkbox" name="myvalue[]" value="value2">
</form>

3 个答案:

答案 0 :(得分:14)

  

我是否可以删除%5B%5D以使网址“漂亮”,例如htaccess?

没有。网址中的[]reserved characters,因此它们必须为URL-encoded

如果使用POST不是一个选项,因为它是一个搜索表单,这是有道理的,你最好的选择是给每个人一个不同的名字,值为1左右。

<form>
    <input type="checkbox" name="option1" value="1" />
    <input type="checkbox" name="option2" value="1" />
</form>

或者,如果您确实坚持使用相同名称,那么您应该自己提取查询字符串,而不是依赖于在获取带有[]后缀的参数时返回数组的PHP特定功能这个名字。

$params = explode('&', $_SERVER['QUERY_STRING']);

foreach ($params as $param) {
    $name_value = explode('=', $param);
    $name = $name_value[0];
    $value = $name_value[1];
    // ... Collect them yourself.
}

这样你就可以继续使用无括号名称了。

<form>
    <input type="checkbox" name="option" value="option1" />
    <input type="checkbox" name="option" value="option2" />
</form>

答案 1 :(得分:2)

[]是网址中的保留字符,因此浏览器必须对其进行编码才能使网址正常工作。您不能在URL中包含这些字符。你也没有任何其他保留字符,如空格,符号等。它们都会自动为你编码(在很多情况下,即使你手动将URL输入浏览器)。

如果您需要“漂亮的网址”,您可以:

  1. 根本不使用表格;提供指向已知“漂亮”网址的链接。

  2. 接受丑陋的网址,但会立即将其重定向到上面第1点中的漂亮网址。

  3. 避免在字段名称中使用尖括号(但这也意味着对后端代码进行了大量更改)

  4. 在表单上使用POST方法,以便字段数据根本不显示在URL上(但这意味着您没有用户可以添加书签的链接)

  5. 如果您必须“美化”此网址,我的建议将是上面的选项2.

    但坦率地说,我不担心。人们不禁要强调“漂亮”的网址。我真的不明白为什么。

    • 我知道的人实际上输入的URL实际上只不过是一个域名。
    • 如果你担心搜索引擎优化,请不要 - 搜索引擎机器人知道ULR编码是什么,并且可以看过它。
    • 想要“漂亮”网址的另一个原因是,如果用户通过电子邮件链接或其他方式共享它,它看起来很好。说实话,如果你担心URL的漂亮性,并且它有表单字段,那么它已经太难看了,只有&=标志遍布整个地方。编码的括号确实不会让它变得更糟。

    所以我诚实的回答是:不要出汗。这是正常的;忽略它;继续进行Web开发工作的更重要部分。

答案 2 :(得分:0)

如果这对您来说真的是一个问题,那么如何使用某种分隔符(如 ,(或任何您想要的))将所有内容“合并”为一个参数。 因此,您最终会得到像 myvalue%5B%5D=value1&myvalue%5B%5D=value2 这样的 URI,而不是像 myvalue=value1,value2 这样的 URI。

这只是一个想法,现在没有代码,但你需要用 JS 来做,并在你的后端解析 param 值(为了有一个数组)。