【问题标题】:How can I accept a hash mark in a URL via $_GET?如何通过 $_GET 接受 URL 中的井号?
【发布时间】:2011-02-26 14:18:20
【问题描述】:

据我所知,井号 (#) 不会发送到服务器,因此我似乎不太可能使用原始 PHP 来解析以下 URL 中的数据:

index.php?name=Ben&address=101 S 10th St Suite #301

我希望使用此 $_GET 数据预填充表单字段。我将如何使用 Javascript(或 jQuery)来做到这一点,并且对于不使用 Javascript 的人来说,是否有一个不会破坏我的表单的回退?目前,如果存在哈希(通常在地址字段中),则之后的所有内容都不会被解析或存储在 $_GET 中。

【问题讨论】:

    标签: php javascript jquery url segment


    【解决方案1】:

    您可以按照urlencode(在 php 中)或 encodeURIComponent(在 JavaScript 中)的方式对哈希进行编码。

    “哈希”不是请求的一部分,这就是您的脚本永远看不到它的原因。

    【讨论】:

    • 我不相信这个有效。我试过 URL /test.php?name=Ben&address=Suite #301 和这个代码 $get = implode($_GET);回声 urlencode($get);它给了我“BenSuite+”
    • @bccarlso - 不,您需要在发送 URL 之前对其进行编码。看看@Ben 的回答如何。
    • 知道了,由于此链接是在电子邮件中生成和发送的,因此可能无法进行,我无法在他们的电子邮件中进行任何编码,并且可能很难在他们之前对电子邮件进行编码发出去。但是现在我知道了需要什么,这让我有了更好的理解,谢谢。
    • @bccarlso - 没问题。是的,除了加载一个 JS 页面之外,您不能对电子邮件做太多事情,该页面基本上在编码 URL 后重定向它们
    【解决方案2】:

    就像 webdestroya 所说,您需要使用 URL 发送请求

    index.php?name=Ben&address=101%20S%2010th%20St%20Suite%20%23301
    

    如果您使用的是 HTML 表单,那么当您提交表单时,字符串值将被自动编码。

    【讨论】:

    • 这可能很困难,因为用户将单击电子邮件中的链接,并且希望看到电子邮件中呈现的井号,而不是显示为 %23 或 %20,无论是哪个.而且我无法在电子邮件中进行任何 PHP 处理。
    【解决方案3】:

    用户将单击电子邮件中的链接,并希望看到电子邮件中呈现的井号

    您需要对 Ben 引用的链接进行编码,然后再将其粘贴到电子邮件中。您目前拥有的根本不是 URL。

    在查询参数的上下文中,您可以选择将空格编码为 + 而不是 %20,但绝对不能包含原始空格,因为它是 URL 的定义特征,它们没有空格。如果您在 Web 浏览器中的 URL 中键入空格,它会悄悄地修复错误,但如果 URL 中充满空格,电子邮件客户端将无法从纯文本中挑选出 URL。

    有时有一个替代函数将空格编码为+ 而不是%20。通常最好避免这种情况,因为+ 并非在所有情况下都有效,但如果愿意:

    index.php?name=Ben&address=101+S+10th+St+Suite+%23301
    

    那么您将使用 PHP 的 urlencode 函数而不是更标准的 rawurlencode

    无论哪种方式,您必须将哈希编码为%23,否则 HTTP URL 中的哈希表示片段标识符(浏览器滚动到的页面部分)。这不是页面本身地址的一部分;它甚至没有从浏览器传递到服务器,因此您当然无法从$_GET 或任何其他接口检索它。

    组件中有许多其他字符,例如在插入 URL 字符串之前必须进行 % 编码的地址,否则它们会给您留下无效或无法使用的 URL。如果所有 %23 业务在 URL 中看起来很有趣……那么,您将不得不忍受它。这就是 URL 一直以来的样子。

    【讨论】:

    • 谢谢。这对我来说非常有意义,你们已经做了很好的解释。我的具体实例中的问题是,我需要在用户可见的电子邮件文本中显示“Suite #301”,以及在URL,但我不希望用户在电子邮件中看到 Suite+%23301。如果我有一种聪明的方法来即时生成数千封电子邮件,我可能会这样做,但我认为我会受到限制。 (除非有办法让 HTML 显示 HEX 编码的实体……并让它在电子邮件客户端中工作。)
    • 如果您正在处理 HTML 邮件,您可以将链接的文本设置为您喜欢的任何内容,而不管真正的 URL 是什么。但是您不能在看起来像链接的末尾给他们文本#301,并期望如果他们将其复制并粘贴到浏览器中它会起作用。 HTML 编码在顶部应用,对您没有任何帮助,但如果您正在生成 HTML 邮件,您肯定需要它(否则 URL 中未编码的 & 将是一个错误)。
    【解决方案4】:

    我通常在卸载时将哈希值存储在 cookie 中

    ej:

    window.unload = function(){
    
     if(document.location.hash) setCoockie('myhash',document.location.hash);
    
    };
    

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 2013-10-12
      • 2013-04-14
      • 2011-08-06
      • 2018-07-28
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多