0

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

Some text
<pre>
#include <cstdio> 

int x = 1;
</pre>
Some text

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

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

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

4

3 回答 3

0

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

于 2011-08-23T14:08:03.877 回答
0

我终于采用了正则表达式,只考虑了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 实体的字符(我们不希望有两次)。

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

于 2011-08-26T00:26:12.113 回答
0

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

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

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

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

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

于 2011-08-26T00:52:27.300 回答