从短码属性转义引号

时间:2013-03-08 作者:Apina

我一直在试图找出如何从短代码属性中转义引号(单引号和双引号)。

基本上,内容是由用户编写的,因此可能会包含“and”引号。问题是,使用“引号”会阻止shortcode属性的功能,例如:

attibute=“此处的一些文本带有“引号”,因此它会停止属性…”

因此,它不是获取整个字符串,而是在第二对引号处停止。

现在,我知道可以使用单引号进行设置,但如果用户在文本中使用单引号,则会留下同样的困境。

我已经研究了各种PHP/WP解决方案,但我似乎无法让它们中的任何一个正常工作,例如esc\\U html、htmlspecialchars、htmlentities。

可能是我设置错误,或者没有在正确的位置执行编码。

这是我目前使用的(无编码)短码(略短)

function aps_person_schema_shortcode( $atts, $content = null)   {

extract( shortcode_atts( array(     
            \'aps_person_description\' => \'\'
        ), $atts
    )
);

$aps_person_return = \'<div class="aps_person_container aps_container">\';
$aps_person_return .= \'<p class="aps_person_description" itemprop="description">\' . $aps_person_description . \'</p>\';
$aps_person_return .= \'</div>\';

return $aps_person_return;

}
add_shortcode(\'aps_person\', \'aps_person_schema_shortcode\');
我尝试在提取数组之后添加

$aps_person_description = esc_html($atts[\'aps_person_description\']); 
但由于属性已经损坏(print\\r显示引号后的字符串被分隔为每个单词的数组项),因此转义字符串不起作用。

在数组之前尝试过它,但它也不起作用。我收到一个通知:未定义索引

那么,为了澄清,您如何清理用户输入的短代码属性数据?

2 个回复
最合适的回答,由SO网友:tfrommen 整理而成

看来你工作的方向不对。

尝试清理用户输入,例如通过sanitize_text_field, 不是短代码输出。

SO网友:samluthebrave

事实证明WordPress shortcode系统使用函数shortcode_parse_atts($text); 解析短代码条目以检索属性的名称和值,并将它们成对存储在数组中$atts, 然后传递给shortcode函数。因此,在您的情况下,在shortcode函数中添加转义操作如下:

$aps_person_description = esc_html($atts[\'aps_person_description\']); 
将不起作用,因为shortcode_parse_atts() 已经检索了属性的名称和值,并且可能错误地解释了属性值中的引号。

要仔细观察,请使用函数shortcode_parse_atts() 使用此正则表达式模式:

/(\\w+)\\s*=\\s*"([^"]*)"(?:\\s|$)|(\\w+)\\s*=\\s*\\\'([^\\\']*)\\\'(?:\\s|$)|(\\w+)\\s*=\\s*([^\\s\\\'"]+)(?:\\s|$)|"([^"]*)"(?:\\s|$)|(\\S+)(?:\\s|$)/
要按以下格式识别属性的名称和值,请执行以下操作:

1. attr1="value1"
2. attr2=\'value2\'
3. attr3=value3
4. "value4"
5. value5
因此,如果用户在值中加引号,很容易出错。例如:

[my_shortcode dog=\'Santa\'s Little Helper\' /]    
// $attr is Array ( [0] => dog=\'Santa\'s [1] => Little [2] => Helper\' )
// should be Array ( [dog] => Santa\'s Little Helper )
解析之后的清理显然为时已晚,那么在解析之前的清理呢?我们必须清理整个条目,因为我们还没有任何要处理的属性值。但这也会导致问题,例如:

html_entities("[my_shortcode dog=\'Santa\'s Little Helper\' /]", ENT_QUOTES);
// now entry is [my_shortcode dog=&#039;Santa&#039;s Little Helper&#039; /]
// after parsing: 
Array
(
    [dog] => &#039;Santa&#039;s
    [0] => Little
    [1] => Helper&#039;
)
矛盾之处在于:为了确保解析引擎正确解析,必须清理属性值;但要做到这一点,您必须首先运行解析引擎来获取值。

总之,我认为确保一切正常的合理方法是确保用户以适当的格式输入属性,一旦用户发布格式不好的属性,这将是一个很大的头痛问题。仅供参考,我的经验是$content. 如果是你,我会aps_person_description$content, 可能是这样的:

[my_shortcode]some text here with "quotes" so it stops the attribute....[/my_shortcode]
报价也不会那么麻烦。

结束

相关推荐

Admin sidebar customization

我的新客户wordpress站点在管理侧栏中没有插件、外观或任何其他默认项。谁能告诉我这些是怎么出现的吗。该站点正在主站点的子目录中运行。它有自己的wordpress安装。主题是前面的rttheme16。提前谢谢。