【问题标题】:Jquery, ajax and the ampersand conundrumJquery、ajax 和 & 符号难题
【发布时间】:2011-03-31 16:32:08
【问题描述】:

我知道我应该对传递给其他任何东西的任何 url 进行编码,因为我读到了这个: http://www.digitalbart.com/jquery-and-urlencode/

我想分享我正在收听的当前曲目的当前时间。 所以我安装了优秀的 yoururls 缩短器。 而且我有一些代码将所有位放在一起,并进行以下操作: 轨道=2&时间=967

因为我不希望每个人都看到我的私钥,所以我有一个小 php 文件,它接受输入并附加以下内容,所以它看起来像这样: http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http://urltoshorten?track=2&time=967

所以在主页面,我调用了$("div.shorturl").load(loadall);的jquery

然后它会做一点 CURL,然后缩短器返回一个不错的短 URL。

像这样:

$myurl='http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=' . $theurl;
$ch = curl_init($myurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
  echo 'cURL failed';
  exit;
}
echo $data;

完美。

除了... 缩短的 URL 始终采用 http://urltoshorten?track=2 的形式 - 缩短 & 号之后的任何内容。

我已经尝试将整个 URL 包装在 php 的 URLencode 中,我已经将 track=2&time=967 包装在 encodeURI 和 encodeURIComponent 中,我已经尝试将整个东西包装在一个或两个中。 即使我可以看到提交的网址最后看起来像 track=1%26time%3D5,& 仍然会破坏它。

如果我将此或什至带有未编码 url 的“普通”版本粘贴到 yoururls 界面中,或者通过 api 将其作为粘贴到浏览器位置栏中的普通 URL 提交到 yoururls,它再次完美运行.

所以这不是你的网址有问题,看起来网址编码正确,我唯一能想到的可能是 CURL?

此时您可能会想“为什么不将 & 替换为 *,然后再将其转换回来?”。 好的,所以当 url 展开时,我会从

var track = $.getUrlVar('track');
var time = $.getUrlVar('time');

所以我可以丢失时间变量,然后稍微查找 * 的位置,然后假设 * 之后的其余部分是时间,但这有点难看,更重要的是,它是不是真正正确的做事方式。

如果有人可以帮助我,将不胜感激。

【问题讨论】:

    标签: php javascript variables curl ampersand


    【解决方案1】:

    我已经尝试将整个 URL 包装在 php 的 URLencode 中

    这确实是您必须做的(假设“URL”是指内部 URL 作为外部 URL 的一个组件传递)。每当您在 URL 组件中输入值时,都需要进行 URL 编码,无论您设置的值是否为 URL。

    $myurl='http://...?...&url='.rawurlencode($theurl);
    

    (urlencode() 可以用于这样的查询参数,但rawurlencode() 也可以用于路径部分,所以除非你真的需要空格来看起来更漂亮[+ vs %20],我会去默认为rawurlencode()。)

    这将为您提供最终 URL,例如:

    http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http%3A%2F%2Furltoshorten%3Ftrack%3D2%26time%3D967
    

    您应该能够验证的作品。如果不是,yourls-api.php 有问题。

    【讨论】:

    • 你绝对的明星!完美运行——我什至不知道 rawurlencode 而不是 urlencode——这确实是一个。天才 - 我是一个快乐的人,非常感谢。
    【解决方案2】:

    我已经尝试将整个 URL 包装在 php 的 URLencode 中,我已经将 track=2&time=967 包装在 encodeURI 和 encodeURIComponent 中,我已经尝试将整个东西包装在一个或两个中。即使我可以看到提交的网址最后看起来像 track=1%26time%3D5,& 仍然会破坏它。

    也许对 HTTP 变量如何工作的解释会对您有所帮助。

    如果我得到一个包含以下变量和值的页面:

    var1 = Bruce Oxford
    var2 = Brandy&Wine
    var3 = ➋➌➔            (unicode chars)
    

    我们对var名称和var的值进行uri-encode,即:

    var1 = Bruce+Oxford
    var2 = Brandy%26Wine
    var3 = %E2%9E%8B%E2%9E%8C%E2%9E%94
    

    我们没有做的是对分隔字符进行编码,所以上面的请求数据看起来像:

    ?var1=Bruce+Oxford&var2=Brandy%26Wine&var3=%E2%9E%8B%E2%9E%8C%E2%9E%94
    

    而不是:

    %3Fvar1%3DBruce+Oxford%26var2%3DBrandy%26Wine%26var3%3D%E2%9E%8B%E2%9E%8C%E2%9E%94
    

    这当然是胡言乱语。

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2010-12-11
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2011-08-24
      • 2011-09-04
      • 2012-02-23
      • 2010-12-05
      相关资源
      最近更新 更多