【问题标题】:Parsing html with phpQuery : how to handle C++ code inside a pre tag?使用 phpQuery 解析 html:如何处理 pre 标记内的 C++ 代码?
【发布时间】:2011-08-23 14:04:21
【问题描述】:

在数据库中我有一些类似这样的代码

Some text
<pre>
#include <cstdio> 

int x = 1;
</pre>
Some text

当我尝试使用 phpQuery 进行解析时,它会失败,因为 &lt;cstdio&gt; 被解释为标签。

我可以使用htmlspecialchars,但仅在pre 标签内应用它,我仍然需要进行一些解析。我可以使用正则表达式,但它会更加困难(我需要处理pre 标签的可能属性)并且使用解析器的想法是避免这种正则表达式的事情。

做我需要做的最好的方法是什么?

【问题讨论】:

    标签: php html parsing pre phpquery


    【解决方案1】:

    记得在组装之前对 HTML(&> 等)进行编码

    【讨论】:

    • 是的,我知道,但编辑是由用户完成的,我不能要求他们这样做。要自动执行此操作,我需要找到一种仅在 pre 标签内对字符进行编码的方法。我可以在不必构建复杂的正则表达式的情况下做到这一点吗?这是我的问题。
    • 好吧——我不知道。 Javascript 有这个内置功能。您必须能够在用户之后但在服务器之前获取内容? var clean = encodeURIComponent(document.getElementById('[你的东西]').textValue);
    • 如果javascript能做到,php也能做到。问题是仅正确识别和编码 pre 标签内的内容,即使标签具有奇怪(但有效)的属性。
    【解决方案2】:

    我终于采用了正则表达式,只考虑pre标签的简单属性(属性内没有'>'):

      foreach(array('pre', 'code') as $sTag)
         $s = preg_replace_callback("#\<($sTag)([^\>]*?)\>(.+?)\<\/$sTag\>#si",
         function($matches)
         {
            $matches[3] = str_replace(array('&amp;', '&lt;', '&gt;'), array('&', '<', '>'), $matches[3]);      
            return "<{$matches[1]} {$matches[2]}>".htmlentities($matches[3], ENT_COMPAT, "UTF-8")."</{$matches[1]}>";
         },
         $s);
    

    它还处理已经转换为 html 实体的字符(我们不希望有两次)。

    不是一个完美的解决方案,但考虑到我需要在其上应用它的数据,它会起作用。

    【讨论】:

      【解决方案3】:

      错误是,您的数据库包含 HTML,其中包含一些尚未正确编码的文本。

      因此,如果您想节省时间并找到正确的解决方案,那么您应该确保数据库中的 HTML 编码正确。这意味着,您应该确保所有内容都已正确编码(使用htmlspecialchars()在保存到您的数据库之前

      否则你只是在你的数据库中保存垃圾,你将不得不编写一些特殊的代码来“美化那些垃圾”。

      任何其他解决方案都是变通方法,而这些解决方案将在您的未来浪费您宝贵的时间。

      所以:最好的解决方案是确保您写入数据库的任何内容都是正确的。

      【讨论】:

      • 是的,确实如此。但是数据库中的内容已经很大,所以我需要对其进行清理(我们又回到了同样的问题)。另外由于用户需要编辑这些文本,我不能要求他们使用&amp;gt; 或者在编辑时必须看到它们......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2011-07-21
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多