13

我在 Twitter 上使用带有弹出式共享按钮的直接链接: <a href="https://twitter.com/intent/tweet?url=<?php echo urlencode(get_permalink());?>&amp;text=<?php echo get_the_title(); ?>&amp;via=username" target="_blank"

有了所有疯狂的社交媒体插件,这是我实现分享按钮的最简单、最直接的方式。

但是,当标题中有一个&时,标题会破坏应该为状态显示的文本。我知道您需要urlencode()标题,但是当我这样做时,它会在状态消息中显示特殊字符。

由于您现在在 Twitter 共享中不需要 a +[space]因此我需要将任何&'s替换为&amp;. 但是,它似乎不适用于str_replace(). 由于某些原因,它会输出 HTML 特殊字符。做类似的事情<?php echo str_replace('&', '&amp;', urldecode(get_the_title())); ?>也行不通。

4

1 回答 1

49

&在 URL 中具有特殊含义,用于分隔多个参数。如果您的 URL 是...a&b...,那不代表文本“a&b”,它代表两个单独的参数。为避免这种情况,您需要urlencode将文本&转换为%26.

编码&to&amp;仅对&HTML 中的字符是必需的,文本中不应包含这些字符,因为所有&s 都替换为%26.

我不知道 Wordpress 的复杂性,但我认为get_the_title()返回一个已经被 HTML 转义的值。意思是,它包含&amp;而不是&,因此如果您像这样发送它,这就是发送到 Twitter 的值。您想要的是获得没有 HTML 实体的文本,即您需要对其进行 HTML 解码以&amp;返回实际值&。然后需要对 HTML 解码的值进行 URL 编码,因此它不会破坏您的 URL 语法。

把它们放在一起,这应该可以做到:

echo urlencode(html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8'));

可能还有其他方法可以直接从 Wordpress 获取没有 HTML 实体的原始标题,而无需进行复杂的操作html_entity_decode,但同样,我对 Wordpress 了解不多。


PS:由于您将该 URL 输出到 HTML 上下文中,您应该再次对 URL 进行 HTML 编码,以确保它不会破坏您的 HTML 语法。不过,这主要是为了学术完整性,urlencode() 不应返回任何可能破坏 HTML 语法的内容。但只是为了迂腐的完整性,在这里:

echo htmlspecialchars(urlencode(html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8')), ENT_COMPAT, 'UTF-8');
于 2012-05-27T05:00:53.727 回答