PHP 转义一个字符串,如果它还没有被实体转义的话
PHP Escape a string if it hasn't already been escaped with entities
我正在使用第 3 方 API,它似乎 return 其数据中已有实体代码。比如The Lion’s Pride
.
如果我按原样打印来自 API 的字符串,它在浏览器中呈现得很好(在上面的示例中,它会放入一个撇号)。但是,我不相信 API 将来会一直使用这些实体,所以我想在打印之前自己使用 htmlentities
或 htmlspecialchars
之类的东西。这样做的问题是它会再次在实体代码中对 & 符号进行编码,最终结果将是 HTML 源中的 The Lion’s Pride
,这不会呈现任何用户友好的内容。
只有在字符串上尚未使用 htmlentities
或 htmlspecialchars
时,我才能使用它?是否有内置方法来检测实体是否已存在于字符串中?
我认为最好的解决方案是首先解码原始字符串中的所有 html entities/special 个字符,然后 html 再次对字符串进行编码。
这样,无论原始字符串是否经过编码,您最终都会得到正确编码的字符串。
解码字符串,然后重新编码实体。 (使用 html_entity_decode()
)
$string = htmlspecialchars(html_entity_decode($string));
似乎没有人回答您的实际问题,所以我会
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 个参数即可不进行双重编码。
没有办法做到你要求的!
你一定知道服务回馈的是什么数据。
其他都是瞎猜的
示例:
如果服务返回 &
但没有转义怎么办?
你会猜到它 是转义 所以你会错误地解释为 &
而正确的值是 &
我正在使用第 3 方 API,它似乎 return 其数据中已有实体代码。比如The Lion’s Pride
.
如果我按原样打印来自 API 的字符串,它在浏览器中呈现得很好(在上面的示例中,它会放入一个撇号)。但是,我不相信 API 将来会一直使用这些实体,所以我想在打印之前自己使用 htmlentities
或 htmlspecialchars
之类的东西。这样做的问题是它会再次在实体代码中对 & 符号进行编码,最终结果将是 HTML 源中的 The Lion’s Pride
,这不会呈现任何用户友好的内容。
只有在字符串上尚未使用 htmlentities
或 htmlspecialchars
时,我才能使用它?是否有内置方法来检测实体是否已存在于字符串中?
我认为最好的解决方案是首先解码原始字符串中的所有 html entities/special 个字符,然后 html 再次对字符串进行编码。
这样,无论原始字符串是否经过编码,您最终都会得到正确编码的字符串。
解码字符串,然后重新编码实体。 (使用 html_entity_decode()
)
$string = htmlspecialchars(html_entity_decode($string));
似乎没有人回答您的实际问题,所以我会
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 个参数即可不进行双重编码。
没有办法做到你要求的!
你一定知道服务回馈的是什么数据。
其他都是瞎猜的
示例:
如果服务返回 &
但没有转义怎么办?
你会猜到它 是转义 所以你会错误地解释为 &
而正确的值是 &