PHP如果尚未使用实体进行转义,则转义字符串

时间:2016-10-17 16:23:57

标签: php string html-entities

我正在使用第三方API,它似乎使用已存在的实体代码返回其数据。例如The Lion’s Pride

如果我按原样从API打印字符串,它在浏览器中渲染得很好(在上面的示例中,它会放入撇号)。但是,我不相信API将来会一直使用这些实体,因此我想在打印之前自己使用htmlentitieshtmlspecialchars这样的内容。这样做的问题是它会再次在实体代码中对&符号进行编码,最终结果将是HTML源代码中的The Lion’s Pride,它不会呈现用户友好的任何内容。

如果字符串上尚未使用htmlentitieshtmlspecialchars,我该怎么办?是否有内置方法来检测字符串中是否已存在实体?

6 个答案:

答案 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));

https://eval.in/662095

答案 3 :(得分:0)

没有办法做你要求的事情!

您必须知道服务所提供的数据类型。

还有其他猜测。

示例:

如果该服务正在回馈&amp; 但未撤消该怎么办?

您会猜到正在逃避,因此您错误地将其解释为&,而正确的值为&amp;

答案 4 :(得分:-1)

您还可以选择使用htmlspecialchars_decode();

$string = htmlspecialchars_decode($string);

答案 5 :(得分:-1)

它已经存在于其中:

php > echo htmlentities('Hi&amp;mom', ENT_HTML5, ini_get('default_charset'), false);
Hi&amp;mom
php > echo htmlentities('Hi&amp;mom', ENT_HTML5, ini_get('default_charset'), true);
Hi&amp;amp&semi;mom

只需使用[可选]第4个参数进行非双重编码。