【问题标题】:What is the correct way to escape a string for a mailto link为mailto链接转义字符串的正确方法是什么
【发布时间】:2012-01-20 11:05:47
【问题描述】:

我在此处的页面中有一个mailto: 链接,其中包括subject=body= 参数,但我不确定如何正确转义参数中的数据。

页面是用utf-8 编码的,所以我猜像德语变音符号这样的所有特殊字符也应该编码为URL 的utf-8 表示形式?

目前我使用rawurlencode(),因为urlencode() 会在所有应该有空格的位置插入+ 字符,但我不确定这是否是正确的做法。

【问题讨论】:

  • 我原以为 rawurlencode()urlencode() 应该完成这项工作 - 浏览器应该在将其传递给邮件客户端之前正确解码任一版本。您还可以创建参数数组并使用http_build_query() - 查询字符串的格式相同。如果要在 HTML 页面中使用,请确保您还通过 htmlspecialchars() 传递任何这些选项的结果字符串...
  • 嗯,它在我想到的所有用例中都这样工作,但也许这不是正确的方法,我的浏览器/邮件客户端只是正确识别并解决该错误,这就是为什么被问到, 只是为了确定:)
  • 可能有一种情况可以工作而另一种不能工作,但如果是这种情况,那就是浏览器没有正确解释它的错误。如果其中一个或另一个存在已知错误,显然最好避免它,但我不知道有任何现代浏览器会犯这样一个基本错误 - 如果有一个,它可能会很差,以至于无论如何都无法使用。

标签: php html url encoding


【解决方案1】:

根据 W3C 标准,您只需 rawurlencode() 电子邮件地址末尾的链接即可。

PHP 手册中有一个 urlencode 的示例(在该页面上搜索 mailto): http://php.net/manual/en/function.urlencode.php

【讨论】:

  • 请注意,'rawurlencode()' 会将 & 符号转义为 &,大多数邮件客户端无法正确解码。应该使用 %26 来替换这些 & 符号,例如 str_replace('&','%26',rawurlencode($subject))
  • @dev_row 使用 str_replace 代码,& 将更改为 %26amp%3B。您首先需要将$amp; 替换为&,然后执行rawurlencode()。另外为什么不使用htmlspecialchars_decode() 而不是str_replace?
  • 我刚刚添加了一个答案,显示了使用此答案和 cmets 的示例:stackoverflow.com/a/46865401/1617737
【解决方案2】:

根据接受的答案和它的 cmets,这是我使用的:

function format_text_for_mailto_param($text) {
    return rawurlencode(htmlspecialchars_decode($text));
}

例子:

$email = "someone@example.org";
$subject = "Test Subject";
<a href="mailto:' . $email . '?subject=' . format_text_for_mailto_param($subject) . '">send email</a>

【讨论】:

  • 函数末尾不用return $text;吗?
【解决方案3】:
function MailToUrl ($strUser, $strServer, $queryParams = null) {
    $strUrl = 'mailto:' . rawurlencode($strUser) . '@' . rawurlencode($strServer);
    if ($queryParams) {
        $strUrl .= '?' . http_build_query($queryParams, null, null, PHP_QUERY_RFC3986);
    }
    return $strUrl;
}

function MailToLink ($strUser, $strServer, $queryParams = null) {
    $strUrl = MailToUrl($strUser, $strServer, $queryParams);

    $strEscapedUrl = htmlspecialchars($strUrl);
    $strVisibleUrl =  htmlspecialchars(rawurldecode($strUrl));

    $strLink = "<a href='{$strEscapedUrl}'>{$strVisibleUrl}</a>";

    return $strLink;
}

print (MailToLink('"very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"', 'test.com', ['subject'=>'this & \ that / ']));
print (MailToLink('müller', 'test.com', ['subject'=>'Einflußgröße']));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2014-03-18
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多