【问题标题】:URL/HTML Escaping/EncodingURL/HTML 转义/编码
【发布时间】:2011-01-24 14:17:06
【问题描述】:

我一直对 URL/HTML 编码/转义感到困惑。我正在使用 PHP,所以想清除一些东西。

我可以说我应该一直使用

  • urlencode: 用于单个查询字符串部分

    $url = 'http://test.com?param1=' . urlencode('some data') . '&param2=' . urlencode('something else');
    
  • htmlentities:用于转义特殊字符,如<>,以便浏览器正确呈现 if

是否还有其他地方可以使用每个功能。我不擅长所有这些逃避的东西,总是被它们弄糊涂

【问题讨论】:

    标签: php html url urlencode html-entities


    【解决方案1】:

    首先,您不应该在大约 99% 的时间使用 htmlentites。相反,您应该使用 htmlspecialchars() 转义文本以在 xml/html 文档中使用。 htmlentities 仅用于显示您正在使用的本机字符集无法显示的字符(如果您的页面是 ASCII 格式,但您想要显示一些 UTF-8 字符,这很有用)。相反,只需将整个页面设为 UTF-8(这并不难),然后就完成了。

    urlencode而言,你一针见血。

    所以,回顾一下:

    • HTML 内部:

      <b><?php echo htmlspecialchars($string, ENT_QUOTES, "UTF-8"); ?></b>
      
    • 在网址内:

      $url = '?foo='.urlencode('bar');
      

    【讨论】:

      【解决方案2】:

      差不多是这样。虽然 - htmlspecialchars 很好,只要你把你的字符集搞清楚。无论如何你应该这样做。所以我倾向于使用它,所以如果我搞砸了,我会尽早发现。

      还请注意,如果您将 url 放入 html 上下文中(例如 - 在 a-tag 的 href 中),您需要将其转义。所以你会经常看到类似的东西:

      echo "<a href='" . htmlspecialchars("?foo=".urlencode($foo)) . "'>clicky</a>"
      

      【讨论】:

      • 很好的答案。这是一个如何在另一个上下文中正确转义上下文的示例。需要注意的是,即使 urlencode 永远不会输出任何特殊的 html 字符来导致任何问题,但转义整个 html 属性内容也没有什么坏处。
      【解决方案3】:

      如果您正在为您的 URL 构建查询字符串,那么最好只使用 http_build_query() 而不是手动编码每个部分。

      $params = [
          'param1' => 'some data',
          'param2' => 'something else',
      ];
      
      echo '<a href="https://test.com?'.htmlspecialchars(http_build_query($params)).'">Link</a>';
      

      HTML 中的所有输出也应该进行 HTML 编码,尽管正确编码的 URL 破坏 HTML 的可能性很小。

      【讨论】:

        猜你喜欢
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多