PHP变量含短代码时单双引号处理及URL截断问题求助
解决PHP短代码引号冲突导致URL截断的问题
嘿,我来帮你搞定这个引号冲突的麻烦!你遇到的核心问题是:当短代码返回带双引号的内容时,和你用来包裹href属性的双引号发生了冲突,浏览器会误把短代码返回的第一个双引号当成href属性的结束标记,导致URL在?text=之后直接截断。
最规范的解决方案:对短代码返回值做URL编码
Twitter的分享链接里的text和url参数本来就需要进行URL编码(不然空格、引号这些特殊字符都会引发解析问题),所以直接对短代码返回的内容做URL编码,既能解决引号冲突,又符合URL标准。
具体代码示例如下:
// 先解析短代码,获取对应的标题和URL值 $post_title = do_shortcode('[slshar text="title"]'); $post_url = do_shortcode('[slshar text="url"]'); // 对参数进行URL编码,处理所有特殊字符(包括引号) $encoded_title = urlencode($post_title); $encoded_url = urlencode($post_url); // 拼接成转义后的HTML字符串 $ret = '<a href="http://twitter.com/intent/tweet?text=' . $encoded_title . '&url=' . $encoded_url . '">Link</a>';
这样生成的最终内容里,text和url参数会变成类似Titre%20du%20post%202和https%3A%2F%2Fpur-plan.com%2Fpost2的编码格式,完全不会和href的双引号冲突,Twitter也能正确解析并显示原内容。
备选方案:转义引号并更换属性分隔符
如果你坚持要保留原引号的显示(虽然Twitter分享链接并不需要),可以把href的属性分隔符换成单引号,同时用htmlspecialchars()把短代码返回值里的双引号转义成HTML实体":
// 解析短代码并转义引号 $post_title = htmlspecialchars(do_shortcode('[slshar text="title"]'), ENT_QUOTES); $post_url = htmlspecialchars(do_shortcode('[slshar text="url"]'), ENT_QUOTES); // 用单引号包裹href属性 $ret = '<a href=\'http://twitter.com/intent/tweet?text=' . $post_title . '&url=' . $post_url . '\'>Link</a>';
这个方法也能解决冲突,但相比URL编码,它不符合URL参数的规范,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Bruno Bros
相关产品推荐
相关产品推荐

