PHP 转义一个字符串,如果它还没有被实体转义的话

PHP Escape a string if it hasn't already been escaped with entities

我正在使用第 3 方 API,它似乎 return 其数据中已有实体代码。比如The Lion’s Pride.

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

只有在字符串上尚未使用 htmlentitieshtmlspecialchars 时,我才能使用它?是否有内置方法来检测实体是否已存在于字符串中?

我认为最好的解决方案是首先解码原始字符串中的所有 html entities/special 个字符,然后 html 再次对字符串进行编码。

这样,无论原始字符串是否经过编码,您最终都会得到正确编码的字符串。

解码字符串,然后重新编码实体。 (使用 html_entity_decode()

$string = htmlspecialchars(html_entity_decode($string));

https://eval.in/662095

似乎没有人回答您的实际问题,所以我会

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 个实体的教育 post 并且我想在屏幕上实际打印它:

The Lion’s Pride

...需要编码为...

The Lion’s Pride 

但是如果那是我们想要在字符串上打印的实际字符串怎么办? ...等等。


底线是,你必须知道你得到了什么并从那里开始工作——这是其他答案的建议所在——这仍然只是解决方法。

如果他们给你双重编码的字符串怎么办?如果他们开始将 html 编码的字符串包装在 XML 中怎么办?然后将其包装在 JSON 中? ... 然后将 JSON 转换为二进制字符串?可能性是无止境。

你所依赖的 API 突然切换输出类型也不是不可能,但也是相当大的违背你与用户的原始契约的行为。在某种程度上,您必须相信 API 会按照它所说的去做。 Unit/Integration 测试构成了信任的其余部分。

并且因为您永远无法编写适用于 任何 他们可能做出的改变的程序,所以尝试预测 任何是毫无意义的 完全改变。

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

$string = htmlspecialchars_decode($string);

它已经在 htmlentities 中:

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&mom

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

没有办法做到你要求的!

你一定知道服务回馈的是什么数据。

其他都是瞎猜的


示例:

如果服务返回 & 但没有转义怎么办?

你会猜到它 是转义 所以你会错误地解释为 & 而正确的值是 &