防止编码现有的HTML实体(转换为&但不是&至& amp;)
问题描述:
我的mysql数据库表中的数据具有特殊字符,如'&'。防止编码现有的HTML实体(转换为&但不是&至& amp;)
虽然使用,然后我需要将它们转换为&
。我使用htmlspecialchars将它们转换为HTML实体。
但很少有条目已经有&
,它将它们转换为&
我需要它们直接使用,而无需转换。
怎么办?
答
我认为最好的解决方案是先解码它们。正常的&
将保持不变,但&
被解码为&
。
然后再次编码它们以将&
和其他特殊字符转换为它们的编码等价物。代码比解释短。 :)
$text = 'Your text with &s from the database';
// Decode and re-encode the special characters.
$text = htmlspecialchars(htmlspecialchars_decode($text));
如果您有没有其他实体以及(如é
为é
),而不是htmlspecialchars
,你也可以使用htmlentities
和html_entity_decode
。解决方案是相同的,但是您可以测试哪一个可以为您提供最佳结果。
$text = 'Your text with &s from the database';
// Decode and re-encode the special characters and other entities.
$text = htmlentities(html_entity_decode($text));
两个htmlspecialchars
和htmlentities
支持doubleencode
参数,默认情况下是真实的,但可以设置为false。这也应该防止双重编码。这听起来像解决方案更清洁,但我没有使用它,我不知道它是否有任何副作用。
答
我更喜欢在数据库中存储纯文本。
&保持&,é保持é,等...
从数据库读取的时候才 '组装' 我用用htmlspecialchars HTML内容()。
这样我就知道存储的内容可以在任何地方使用,无论它是html还是文本。
这个问题是超级混乱。数据库中的数据包含'&',您正在使用'htmlspecialchars()'将这些数据转换为HTML实体,但数据库中还有其他一些条目具有'&',但您不希望这些特定条目通过'htmlspecialchars()'来转换'&'? – Ohgodwhy
你可能会想利用一个正则表达式来实现这一点。可能沿着'&(?! amp;)'的行应该标识“裸”符号。 – CollinD
@ohgodwhy他有数据的混合。一些安全的HTML,有些不是。他要求简单地清理裸号符号,但不是已经逃脱的“&”符号,因为编辑答案时,感谢@Paul Crovella编写了'&' – CollinD