将 Json 中的 HTML 个实体转换回字符
Convert HTML entities in Json back to characters
问题与原始数据
我有一个 json 数据,其中包含一些 HTML 实体来编码一些特殊字符(主要来自法语,如“é”、“ç”、“à”等)和 html 标签。
这是我的 json 数据样本:
{
"data1": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l&rsquo;abbaye du Val-Beno&icirc;t</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}
想要的结果
{
"data1": "<p>Le cartulaire de 1380-1381 copié au XVIIe siècle et aujourd’hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l’abbaye du Val-Benoît</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}
所以,我希望简单地将所有 HTML 实体解码回它们各自的字符和标签。我尝试用 php.
来做到这一点
有我现在的代码:
/* decode data */
$jsonData = '{
"data1": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l&rsquo;abbaye du Val-Beno&icirc;t</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}';
$data = json_decode($jsonData, true);
/* change html entities and re-encode data */
$data = mb_convert_encoding($data, "UTF-8", "HTML-ENTITIES");
header('Content-Type: application/json; Charset="UTF-8"');
echo json_encode($data, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
我目前的成绩:
{
"data1": "<p>Le cartulaire de 1380-1381 copié au XVIIe siècle et aujourd’hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l’abbaye du Val-Benoît</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}
因此,HTML 标签转换得很好。但是法语特殊字符的 HTML 实体留在这里(但是,例如 &eacute;
现在我有 é
)。
问题。
如何将 HTML 实体转换回字符?
您可以在这里在线测试:https://www.tehplayground.com/Z4uB5KIPPo4UQ4h1
非常感谢!
更新:
最后,我的数据比我想象的要复杂。在同一数据中,一些字符被保留为“é”、“à”、“ç”等,其他一些字符被转换为 HTM 实体。所以我可以有这样的东西:
{
"someData1":
{
"data1":
[
"ecclésiastique"
],
"data2": "s&eacute;culiers"
},
"someData2":
[
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
},
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
}
]
}
所以,我想我必须 1) 将所有数据转换为 HTML 个实体; 2) 将所有 HTML 个实体转换回字符…
这是我当前的代码:
# Get data
$jsonData = '{
"someData1":
{
"data1":
[
"ecclésiastique"
],
"data2": "s&eacute;culiers"
},
"someData2":
[
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
},
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
}
]
}';
$data = json_decode($jsonData, true);
# Convert character encoding
$data = mb_convert_encoding($data, "UTF-8", "HTML-ENTITIES");
# Convert HTML entities to their corresponding characters
function html_decode(&$item){
$item = html_entity_decode($item);
}
array_walk_recursive($data, 'html_decode');
var_dump ($data);
所以,我反码成功了。 HTML个实体变成特殊角色,特殊角色变成HTML个实体。
但我不知道如何只获取特殊字符。
有解决办法。我需要
- 将
&
转换为 &
以标准化编码系统;
- 将所有适用的字符转换为 HTML 个实体。
有最终代码。非常感谢大家的意见和建议。
完整代码和在线测试在这里:https://www.tehplayground.com/zythX4MUdF3ric4l
array_walk_recursive($data, function(&$item, $key) {
if(is_string($item)) {
$item = str_replace("&", "&", $item); // 1. Replace & by &
$item = html_entity_decode($item); // 2. Convert HTML entities to their corresponding characters
}
});
问题与原始数据
我有一个 json 数据,其中包含一些 HTML 实体来编码一些特殊字符(主要来自法语,如“é”、“ç”、“à”等)和 html 标签。 这是我的 json 数据样本:
{
"data1": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l&rsquo;abbaye du Val-Beno&icirc;t</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}
想要的结果
{
"data1": "<p>Le cartulaire de 1380-1381 copié au XVIIe siècle et aujourd’hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l’abbaye du Val-Benoît</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}
所以,我希望简单地将所有 HTML 实体解码回它们各自的字符和标签。我尝试用 php.
来做到这一点有我现在的代码:
/* decode data */
$jsonData = '{
"data1": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l&rsquo;abbaye du Val-Beno&icirc;t</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}';
$data = json_decode($jsonData, true);
/* change html entities and re-encode data */
$data = mb_convert_encoding($data, "UTF-8", "HTML-ENTITIES");
header('Content-Type: application/json; Charset="UTF-8"');
echo json_encode($data, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
我目前的成绩:
{
"data1": "<p>Le cartulaire de 1380-1381 copié au XVIIe siècle et aujourd’hui perdu<strong>*</strong>.",
"data2": "<p><strong>*</strong> Joseph CUVELIER, <em>Cartulaire de l’abbaye du Val-Benoît</em>, Bruxelles, 1906, p. XI-XXVII.</p>"
}
因此,HTML 标签转换得很好。但是法语特殊字符的 HTML 实体留在这里(但是,例如 &eacute;
现在我有 é
)。
问题。 如何将 HTML 实体转换回字符?
您可以在这里在线测试:https://www.tehplayground.com/Z4uB5KIPPo4UQ4h1
非常感谢!
更新:
最后,我的数据比我想象的要复杂。在同一数据中,一些字符被保留为“é”、“à”、“ç”等,其他一些字符被转换为 HTM 实体。所以我可以有这样的东西:
{
"someData1":
{
"data1":
[
"ecclésiastique"
],
"data2": "s&eacute;culiers"
},
"someData2":
[
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
},
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
}
]
}
所以,我想我必须 1) 将所有数据转换为 HTML 个实体; 2) 将所有 HTML 个实体转换回字符…
这是我当前的代码:
# Get data
$jsonData = '{
"someData1":
{
"data1":
[
"ecclésiastique"
],
"data2": "s&eacute;culiers"
},
"someData2":
[
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
},
{
"anotherData1": "ecclésiastique",
"anotherData2": "<p>Le cartulaire de 1380-1381 copi&eacute; au XVIIe si&egrave;cle et aujourd&rsquo;hui perdu<strong>*</strong>.",
"anotherData3":
{
"text1": "texte here",
"text2": "texte here"
}
}
]
}';
$data = json_decode($jsonData, true);
# Convert character encoding
$data = mb_convert_encoding($data, "UTF-8", "HTML-ENTITIES");
# Convert HTML entities to their corresponding characters
function html_decode(&$item){
$item = html_entity_decode($item);
}
array_walk_recursive($data, 'html_decode');
var_dump ($data);
所以,我反码成功了。 HTML个实体变成特殊角色,特殊角色变成HTML个实体。
但我不知道如何只获取特殊字符。
有解决办法。我需要
- 将
&
转换为&
以标准化编码系统; - 将所有适用的字符转换为 HTML 个实体。
有最终代码。非常感谢大家的意见和建议。
完整代码和在线测试在这里:https://www.tehplayground.com/zythX4MUdF3ric4l
array_walk_recursive($data, function(&$item, $key) {
if(is_string($item)) {
$item = str_replace("&", "&", $item); // 1. Replace & by &
$item = html_entity_decode($item); // 2. Convert HTML entities to their corresponding characters
}
});