【问题标题】:php prevent & creating codes in a string [duplicate]php防止和在字符串中创建代码[重复]
【发布时间】:2017-03-29 00:14:56
【问题描述】:

好的,我确信有一个超级简单的解决方案,但我必须生成一个字符串来获取一个 json 文件。我知道我应该使用 & amp;而不是&,但由于某种原因它对我不起作用。我的问题是我在尝试创建字符串时得到 ¤

$apistr     = 'https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey='.$companyKey.'&countryFrom='.$countryFrom.'&countryTo='.$countryTo.'&currencyFrom='.$currencyFrom.'&currencyTo='.$currencyTo.'&amount='.$amount;

吐出来了:

https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey=23e9b66aspp6z&countryFrom=AU&countryTo=FJ¤cyFrom=AUD¤cyTo=FJD&amount=200

代替:

https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey=23e9b66aspp6z&countryFrom=AU&countryTo=FJ&CurrencyFrom=AUD&CurrencyTo=FJD&amount=200

任何帮助都会很棒。

编辑:

这是变量的var_dump和url:

string(13) "23e9b66aspp6z"
string(2) "AU"
string(2) "FJ"
string(3) "AUD"
string(3) "FJD"
string(3) "200"
string(159) "https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey=23e9b66aspp6z&countryFrom=AU&countryTo=FJ¤cyFrom=AUD¤cyTo=FJD&amount=200" 

【问题讨论】:

    标签: php


    【解决方案1】:

    你应该对变量的内容进行urlencode:

    $apistr     = 'https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey='.urlencode($companyKey).'&countryFrom='.urlencode($countryFrom).'&countryTo='.urlencode($countryTo).'&currencyFrom='.urlencode($currencyFrom).'&currencyTo='.urlencode($currencyTo).'&amount='.urlencode($amount);
    

    如果其中有你没想到的内容,也可能会更清楚。

    不,您应该使用 &在 url 中编码 &。

    要检查你可以做的变量的内容:

    var_dump($companyKey);
    var_dump($countryFrom);
    var_dump($countryTo);
    var_dump($currencyFrom);
    var_dump($currencyTo);
    var_dump($amount);
    var_dump($apistr);
    

    如果您将 $apistr 的内容回显到您的网络浏览器,&curren 将显示为货币字形 ¤ 作为 html 实体 ¤已保留。

    尝试以这种方式将其回显到您的浏览器(但不要将其用作 url! 变量 $apistr 包含您所期望的 - 只有调试回显输出是错误的,以防渲染您的浏览器):

    回显 htmlspecialchars($apistr);

    当您只输出一串字符时,您的渲染应用程序就是您的网络浏览器。您还可以查看包含假定错误 url 的网页源代码。您应该在源代码中看到正确的字符。 htmlspecialchars($apistr); 的输出在源代码中看起来是错误的,但在呈现的网页中是正确的。

    【讨论】:

    • 谢谢,但我仍然得到 ¤cyFrom 和 ¤cyTo - 而不是 &currencyFrom 和 &currencyTo..
    • 如何查看字符串的内容?
    • 我只是在附和它
    • 我在原始问题中添加了 var_dump 结果
    • 非常感谢,终于摆脱了特殊字符 :)
    【解决方案2】:

    我有几件事要提。

    1. 我发现通过字符串连接手动形成 url 的查询字符串非常长、混乱且难以维护。此外,为了确保对查询字符串进行正确编码,您最终需要进行 nurlencode() 调用,这不是非常漂亮/高效。对于这份工作,我总是提倡http_build_query() 的可读性、简洁性和可靠性。请注意,如果您的数据中有任何 null 值,则键值对将被省略。

    2. 有正当理由使用& 而非& 作为查询字符串中的粘合剂。我个人想知道为什么我经常在 Joomla 脚本中看到这种技术,并得到了良好文档支持的答案。 Why are Joomla url query strings commonly delimited with “&” instead of “&”?

    3. 这个问题更多的是关于 html 页面上 url 的视觉呈现,而不是关于维护超链接的可行性。事实上,当写入href 属性时,不会损坏数据——&s 会自动神奇地编码为&。当您将鼠标悬停在链接上时,该 url 完全符合预期。只有当浏览器为 html 文档呈现可见文本时,它才会误解您的预期输出并将&curren 转换为¤。本质上,您只需对要添加到文档的可见文本调用htmlentities()

    这是一个使用http_build_query() 保持代码“精简”(不需要过度水平滚动)的演示:

    $queryParams = [
        'action' => 'getOnlineQuotes',
        'companyKey' => '23e9b66aspp6z',
        'countryFrom' => 'AU',
        'countryTo' => 'FJ',
        'currencyFrom' => 'AUD',
        'currencyTo' => 'FJD',
        'amount' => '200'
    ];
    
    $url = 'https://remitradar.com/JsonRequests.aspx?' . http_build_query($queryParams);
    echo "<a href=\"{$url}\">" .
             $url .
             "<br><br>" . 
             htmlentities($url) . 
         "</a>";
    

    源代码:

    <a href="https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&amp;companyKey=23e9b66aspp6z&amp;countryFrom=AU&amp;countryTo=FJ&amp;currencyFrom=AUD&amp;currencyTo=FJD&amp;amount=200">
        https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&amp;companyKey=23e9b66aspp6z&amp;countryFrom=AU&amp;countryTo=FJ¤cyFrom=AUD¤cyTo=FJD&amp;amount=200
    
        https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&amp;companyKey=23e9b66aspp6z&amp;countryFrom=AU&amp;countryTo=FJ&amp;currencyFrom=AUD&amp;currencyTo=FJD&amp;amount=200
    </a>
    

    可见输出:

    https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey=23e9b66aspp6z&countryFrom=AU&countryTo=FJ¤cyFrom=AUD¤cyTo=FJD&amount=200
    
    https://remitradar.com/JsonRequests.aspx?action=getOnlineQuotes&companyKey=23e9b66aspp6z&countryFrom=AU&countryTo=FJ&currencyFrom=AUD&currencyTo=FJD&amount=200
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2017-07-30
      • 1970-01-01
      • 2015-05-28
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多