我正在使用第三方API,它似乎使用已存在的实体代码返回其数据。例如The Lion’s Pride
。
如果我按原样从API打印字符串,它在浏览器中渲染得很好(在上面的示例中,它会放入撇号)。但是,我不相信API将来会一直使用这些实体,因此我想在打印之前自己使用htmlentities
或htmlspecialchars
这样的内容。这样做的问题是它会再次在实体代码中对&符号进行编码,最终结果将是HTML源代码中的The Lion’s Pride
,它不会呈现用户友好的任何内容。
如果字符串上尚未使用htmlentities
或htmlspecialchars
,我该怎么办?是否有内置方法来检测字符串中是否已存在实体?
答案 0 :(得分:3)
似乎没有人回答你的实际问题,所以我会
只有在字符串上尚未使用htmlentities或htmlspecialchars时,我才能使用它?是否有内置方法来检测字符串中是否已存在实体?
这是不可能的。如果我正在制作关于HTML实体的教育帖子,我想在屏幕上实际打印出来怎么办:
The Lion’s Pride
......它需要编码为......
The Lion’s Pride
但是,如果那是我们想要在字符串上打印的实际字符串呢? ......等等。
最重要的是,您必须知道您已经获得了什么并从那里开始工作 - 这是其他答案的建议所在 - 这仍然是一种解决方法。
如果他们给你双重编码字符串怎么办?如果他们开始用XML包装html编码的字符串怎么办?然后用JSON包装它? ...然后JSON转换为二进制字符串?可能性是无止境。
您依赖的API突然切换输出类型并非不可能,但这也违反了与用户的原始合同。在某种程度上,你必须对API有所信任,才能按照它所说的去做。单元/集成测试构成了信任的其余部分。
因为您永远无法编写适用于任何可能发生的更改的程序,所以尝试预测任何更改都是毫无意义的。< /强>
答案 1 :(得分:0)
我认为最好的解决方案是首先解码原始字符串中的所有html实体/特殊字符,然后再次对字符串进行html编码。
这样,无论原始字符串是否编码,您最终都会得到正确编码的字符串。
答案 2 :(得分:0)
解码字符串,然后重新编码实体。 (使用html_entity_decode()
)
$string = htmlspecialchars(html_entity_decode($string));
答案 3 :(得分:0)
没有办法做你要求的事情!
您必须知道服务所提供的数据类型。
还有其他猜测。
示例:
如果该服务正在回馈&
但未撤消该怎么办?
您会猜到正在逃避,因此您错误地将其解释为&
,而正确的值为&
答案 4 :(得分:-1)
您还可以选择使用htmlspecialchars_decode();
$string = htmlspecialchars_decode($string);
答案 5 :(得分:-1)
它已经存在于其中:
php > echo htmlentities('Hi&mom', ENT_HTML5, ini_get('default_charset'), false);
Hi&mom
php > echo htmlentities('Hi&mom', ENT_HTML5, ini_get('default_charset'), true);
Hi&amp;mom
只需使用[可选]第4个参数进行非双重编码。