用PHPQu疑问解析HTML:如何在预标记中处理C++代码?

用PHPQu疑问解析HTML:如何在预标记中处理C++代码?,php,html,parsing,pre,phpquery,Php,Html,Parsing,Pre,Phpquery,在数据库中,我有一些这样的代码 Some text <pre> #include <cstdio> int x = 1; </pre> Some text 当我尝试使用phpQuery进行解析时,它失败了,因为被解释为标记 我可以使用htmlspecialchars,但要仅在pre标记中应用它,我仍然需要进行一些解析。我可以使用正则表达式,但要处理pre标记的可能属性要困难得多,使用解析器的想法是为了避免这种正则表达式 做我需要做的事情的最佳方法是什么?

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

Some text
<pre>
#include <cstdio> 

int x = 1;
</pre>
Some text
当我尝试使用phpQuery进行解析时,它失败了,因为被解释为标记

我可以使用htmlspecialchars,但要仅在pre标记中应用它,我仍然需要进行一些解析。我可以使用正则表达式,但要处理pre标记的可能属性要困难得多,使用解析器的想法是为了避免这种正则表达式


做我需要做的事情的最佳方法是什么?

记住在组装之前要对HTML进行编码&>等等

我最后选择了正则表达式,只考虑属性中的前标记号“>”的简单属性:

它还处理已经转换为html实体的字符,我们不想再使用它两次


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

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

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

否则,您只需在数据库中保存垃圾,您将不得不编写一些特殊代码来美化垃圾

任何其他的解决方案都是权宜之计,这些都会在未来花费你宝贵的时间


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

是的,我知道,但编辑是由用户完成的,我不能要求他们这样做。为了自动完成这项工作,我需要找到一种只在pre标记中编码字符的方法。我可以不用构建一个复杂的正则表达式就可以做到这一点吗?这是我的问题,好吧,我不知道。Javascript有这个内置功能。您必须能够在用户之后但在服务器之前获取内容?var clean=encodeURIComponentdocument.getElementById'[your stuff]'.textValue;如果javascript可以做到,php也可以做到。问题是要正确地识别和编码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);