用phpQuery解析html:如何处理前标记中的c++代码


Parsing html with phpQuery : how to handle C++ code inside a pre tag?

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

Some text
<pre>
#include <cstdio> 
int x = 1;
</pre>
Some text

当我试图使用phpQuery进行解析时,它失败了,因为<cstdio>被解释为标记。

我可以使用htmlspecialchars,但只在pre标签内应用它,我仍然需要做一些解析。我可以使用regex,但它将更加困难(我将需要处理pre标记的可能属性),使用解析器的想法是避免这种regex的事情。

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

记住要对HTML进行编码(&比;

我最终选择了正则表达式的方式,只考虑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实体的字符(我们不想有两次)。

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

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

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

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

任何其他解决方案都是变通的,它们将在未来花费你宝贵的时间。

所以:最好的解决方案是确保,任何你写到你的数据库是正确的