htmlspecialchars_decode / html_entity_decode - 结果未被解释为HTML

时间:2014-07-09 17:55:47

标签: php php-5.3

正如标题所示 - 我有一种情况,我正在迭代一系列解码的html(尝试使用htmlspecialcharacters_decode()和html_entities_decode)。但是,解码后的字符串被DOM视为textNode。 php 5.3.28

示例:

    <div>
      <h1>This is in the middle of a template file</h1>
        <?php
            foreach ($assocArrayObjEle as $obyKey => $obyMeat) {
                 if (!is_null($obyMeat->description) &&  strlen($obyMeat->description)> 0)
                 {
                 print html_entity_decode($obyMeat->description);
                 }  
                }
        ?>
    </div>

结果如下:

             

这是在模板文件的中间

&lt; p&gt;这是html,括号不作为实体序列进行转义 - 但是这个文本主体被视为HTML文本节点。这似乎不是每个手册条目的预期结果以及我找到的主题的阅读内容。所有实体都得到了妥善处理,但结果只是作为DOM中的textNode而不是DOM元素撤销。提前致谢&lt; / p&gt;

作为示例输出状态 - 实体确实被重新分解为有效标记但是它们被附加到DOM(或者更确切地说DOM决定了这个?)这是包含元素的textNode的值 - 而不是DOMElement组。提前致谢

1 个答案:

答案 0 :(得分:0)

好的,无论出于何种原因,htmlspecialchars_decode()的单次传递都没有完成。这是非常奇怪的,因为&lt;否则需要显示为&amp;lt;才能实现这一点 - 无论如何,如果其他人需要它,请留在这里。解决方案看起来像:

<div>
      <h1>This is in the middle of a template file</h1>
        <?php
            foreach ($assocArrayObjEle as $obyKey => $obyMeat) {
                 if (!is_null($obyMeat->description) &&  strlen($obyMeat->description)> 0)
                 {
                     echo htmlspecialchars_decode(htmlspecialchars_decode($obyMeat->description,  ENT_QUOTES), ENT_NOQUOTES); //2nd pass was necessary even tho there were no double escaped entites (amperstands not being double escaped).
                 }  
                }
        ?>
    </div>