在数据库中,我有一些像这样的代码
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('&', '<', '>'), array('&', '<', '>'), $matches[3]);
return "<{$matches[1]} {$matches[2]}>".htmlentities($matches[3], ENT_COMPAT, "UTF-8")."</{$matches[1]}>";
},
$s);
它还处理已经转换为html实体的字符(我们不想有两次)。
不是一个完美的解决方案,但考虑到我需要应用它的数据,它会做的工作。
错误是,您的数据库包含HTML
,其中包含一些未正确编码的文本。
因此,如果您想节省时间并有一个正确的解决方案,那么您应该确保数据库中的HTML是正确编码的。这意味着,在保存到数据库之前,您应该确保所有内容都被正确编码(使用htmlspecialchars()
) !
否则,你只是在数据库中保存垃圾,你将不得不编写一些特殊的代码来"美化垃圾"。
任何其他解决方案都是变通的,它们将在未来花费你宝贵的时间。
所以:最好的解决方案是确保,任何你写到你的数据库是正确的