我正在使用第 3 方 API,它返回的数据似乎已经包含实体代码。比如 The Lion’s Pride
。
如果我按原样从 API 打印字符串,它在浏览器中呈现得很好(在上面的示例中,它会放入一个撇号)。但是,我不相信 API 将来会一直使用这些实体,所以我想在打印之前自己使用 htmlentities
或 htmlspecialchars
之类的东西。这样做的问题是它会再次对实体代码中的 & 符号进行编码,最终结果将是 HTML 源代码中的 The Lion’s Pride
,这不会呈现任何用户友好的内容。
只有当 htmlentities
或 htmlspecialchars
尚未在字符串上使用时,我才能使用它?是否有内置方法来检测实体是否已存在于字符串中?
最佳答案
似乎没有人回答您的实际问题,所以我会
How can I use htmlentities or htmlspecialchars only if it hasn't already been used on the string? Is there a built-in way to detect if entities are already present in the string?
这是不可能的。如果我正在制作一篇关于 HTML 实体的教育性文章,并且我想在屏幕上实际打印它:
The Lion’s Pride
...它需要被编码为...
The Lion’s Pride
但是如果那是我们想要在字符串上打印的实际字符串呢? ...等等。
底线是,您必须知道您得到的是什么并从那里开始工作——这是其他答案的建议所在——这仍然只是一种解决方法。
如果他们给你双重编码的字符串怎么办?如果他们开始用 XML 包装 html 编码的字符串怎么办?然后用 JSON 包装它? ... 然后将 JSON 转换为二进制字符串?可能性是无止境。
您所依赖的 API 突然切换输出类型并非不可能,但这也是对您与用户的原始契约(Contract)的相当大的违反。在某种程度上,您必须对 API 有一定的信任才能按照它所说的去做。单元/集成测试构成了信任的其余部分。
并且因为您永远无法编写适用于他们可能做出的任何改变的程序,所以尝试预测任何改变是毫无意义的。强>
关于PHP 转义一个字符串,如果它还没有被实体转义的话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40091284/