用于url请求的单引号的PHP字符串

时间:2016-04-05 11:31:18

标签: php string url quotes

有一些网站,whitch使用odata协议进行api访问。 例如,要加载具有特定状态ID的用户,我可以使用此URL:

https://domain.com/contacts/?$filter=status_id eq 1

简单明了。在这种情况下,我只是定义一个字符串并使用curl获得预期的响应:

$ch = curl_init();
$query = 'https://domain.com/contacts/?$filter=status_id eq 1'
curl_setopt($ch, CURLOPT_URL, $query);
$response = curl_exec($ch);

但真正的问题始于此:

https://domain.com/contacts/?$filter=email eq 'email@example.com'

此处电子邮件包含单引号。我已尝试使用转义单引号和双引号:

$query = 'https://domain.com/contacts/?$filter=email eq \'email@example.com\''
$query = "https://domain.com/contacts/?\$filter=email eq 'email@example.com'"

这些都没有奏效 - 我每次都收到请求错误。 但是,如果我在ruby中运行它 - 一切都按预期运行:

RestClient.get "https://domain.com/contacts/?$filter=email eq 'email@example.com'", []

我可以在这做什么? PHP的版本是5.3。

1 个答案:

答案 0 :(得分:2)

https://domain.com/contacts/?$filter=email eq 'email@example.com'

这不是有效的URI。有效的URI编码形式为:

https://domain.com/contacts/?%24filter=email%20eq%20'email%40example.com'

网址包含某些特殊字符,您无法直接使用这些特殊字符,但必须将其编码为%..个序列才能生效。您可以使用rawurlencode在PHP中执行此操作。您必须单独编码项目

$url = 'https://domain.com/contacts/?' . rawurlencode('$filter') . '=' . rawurlencode("email eq 'email@example.com'");

接收服务器是否接受该URL是一个不同的主题,但至少您已经覆盖了最终的基础知识。