【问题标题】:DOMDocument::loadHTML(): warning - htmlParseEntityRef: no name in EntityDOMDocument::loadHTML(): 警告 - htmlParseEntityRef: 实体中没有名称
【发布时间】:2013-02-01 14:25:38
【问题描述】:

我发现了几个类似的问题,但到目前为止,没有一个能够帮助我。

我试图在 HTML 块中输出所有图像的“src”,所以我使用DOMDocument()。这种方法确实有效,但我在某些页面上收到警告,我不知道为什么。一些帖子建议隐藏警告,但我更愿意找出生成警告的原因。

警告:DOMDocument::loadHTML(): htmlParseEntityRef: 没有名字 实体,行:10

产生错误的post->post_content 的一个示例是 -

On Wednesday 21st November specialist rights of way solicitor Jonathan Cheal of Dyne Drewett will be speaking at the Annual Briefing for Rural Practice Surveyors and Agricultural Valuers in Petersfield.
<br>
Jonathan is one of many speakers during the day and he is specifically addressing issues of public rights of way and village greens.
<br>
Other speakers include:-
<br>
<ul>
<li>James Atrrill, Chairman of the Agricultural Valuers Associates of Hants, Wilts and Dorset;</li>
<li>Martin Lowry, Chairman of the RICS Countryside Policies Panel;</li>
<li>Angus Burnett, Director at Martin & Company;</li>
<li>Esther Smith, Partner at Thomas Eggar;</li>
<li>Jeremy Barrell, Barrell Tree Consultancy;</li>
<li>Robin Satow, Chairman of the RICS Surrey Local Association;</li>
<li>James Cooper, Stnsted Oark Foundation;</li>
<li>Fenella Collins, Head of Planning at the CLA; and</li>
<li>Tom Bodley, Partner at Batcheller Monkhouse</li>
</ul>

如果有帮助,我可以发布更多post-&gt;post_content 包含的示例?

我已暂时允许访问开发站点,因此您可以查看一些示例 [注意 - 已回答问题后无法再访问链接] -

关于如何解决这个问题的任何提示?谢谢。

$dom = new DOMDocument();
$dom->loadHTML(apply_filters('the_content', $post->post_content)); // Have tried stripping all tags but <img>, still generates warning
$nodes = $dom->getElementsByTagName('img');
foreach($nodes as $img) :
    $images[] = $img->getAttribute('src');
endforeach;

【问题讨论】:

  • 显示导致错误的行肯定会使调试更容易。
  • ???警告在DOMDocument::loadHTML();,所以导致错误的行是dom-&gt;loadHTML(apply_filters('the_content', $post-&gt;post_content));
  • 您正在解析的内容的第 10 行...
  • 好的,和你一起。在一种情况下,它是James Cooper, Stnsted Oark Foundation;。我确实认为可能是 ; 导致了这个问题,但是将它们全部替换(之前有几个)并没有帮助。
  • @DavidGard 我最好的猜测是在 HTML 中的某处有一个未转义的 & 符号 (&amp;)。这将使解析器认为我们在实体引用中(例如&amp;copy;)。当它到达; 时,它认为实体已经结束。然后它意识到它所拥有的内容不符合实体,因此它发出警告并将内容作为纯文本返回。

标签: php warnings domdocument


【解决方案1】:

这个正确答案来自@lonesomeday 的评论。

我最好的猜测是在 HTML 中的某处有一个未转义的 & 符号。这将使解析器认为我们在实体引用中(例如 ©)。当它到达 ; 时,它认为实体已经结束。然后它意识到它所拥有的内容不符合实体,因此它发出警告并将内容作为纯文本返回。

【讨论】:

  • 那我该如何解决呢?我不能在整个 html 字符串上调用 htmlentities。
  • @MavWolverine 我知道这是多年以后的事了,但我只是遇到了同样的问题。我发现的最简单的选项就是将str_replace(' &amp; ', ' &amp;amp; ', $string) 替换为htmlentitieshtmlspecialcharacters 导致HTML 标记的&lt;&gt; 被转换。现在我 100% 确定有更好的方法来做到这一点,但这对我在一个简单的一次性解析工作中所需的内容进行了排序。
  • @PanPipes 更严格一点:preg_replace("/&amp;(?!\S+;)/", "&amp;amp;", $string).
  • 这节省了我的时间,我一直在苦苦挣扎,后来发现用户生成的内容在名称中包含 &,这是所有错误的根源。谢谢
【解决方案2】:

【讨论】:

  • 并像 @$dom-&gt;loadHTML($html); 这样加载 html 对我有帮助。
  • 这解决了我的问题
  • 太好了,stackoverflow 又救了我 ;)
【解决方案3】:

在任何地方检查 HTML 代码中的“&”字符。由于这种情况,我遇到了这个问题。

【讨论】:

  • 并将&amp;amp;替换为&amp;amp;
【解决方案4】:

我没有在上面发表评论所需的声誉,但在我的情况下使用htmlspecialchars 解决了这个问题:

$inputHTML = htmlspecialchars($post->post_content);
$dom = new DOMDocument();
$dom->loadHTML(apply_filters('the_content', $inputHTML)); // Have tried stripping all tags but <img>, still generates warning
$nodes = $dom->getElementsByTagName('img');
foreach($nodes as $img) :
    $images[] = $img->getAttribute('src');
endforeach;

出于我的目的,我也在使用strip_tags($inputHTML, "&lt;strong&gt;&lt;em&gt;&lt;br&gt;"),因此所有图像标签也被删除了 - 我不确定这是否会成为问题。

【讨论】:

    【解决方案5】:

    我最终以正确的方式解决了这个问题,使用 tidy

    // Configuration
    $config = array(
        'indent'         => true,
        'output-xhtml'   => true,
        'wrap'           => 200);
    
    // Tidy to avoid errors during load html
    $tidy = new tidy;
    $tidy->parseString($bill->bill_text, $config, 'utf8');
    $tidy->cleanRepair();
    
    $domDocument = new DOMDocument();
    $domDocument->loadHTML(mb_convert_encoding($tidy, 'HTML-ENTITIES', 'UTF-8'));
    

    【讨论】:

    • 欢迎来到 StackOverflow。请说明您的代码如何解决问题。
    • 我相信 loadHTML 方法无法处理格式错误的 HTML。使用 tidy 帮助我解决了这个问题。
    【解决方案6】:

    对于 laravel,

    使用 {{ }} 代替 {!! !!}

    我遇到了这个问题,我设法解决了。

    【讨论】:

      【解决方案7】:

      我发现我的表格标签中有错误。有一个额外的&lt;/td&gt; 我删除和宾果游戏。

      【讨论】:

        【解决方案8】:

        只需将字符串中的“&”替换为“and”即可。对所有其他符号执行此操作

        【讨论】:

        • 不,这是一个糟糕的建议。 &amp; 的使用是出于特定目的,在大多数情况下,简单地将其替换为 and 并不符合要求。公司名称就是一个明显的例子。
        猜你喜欢
        • 2012-09-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        相关资源
        最近更新 更多