将 Json 中的 HTML 个实体转换回字符

Convert HTML entities in Json back to characters

问题与原始数据

我有一个 json 数据,其中包含一些 HTML 实体来编码一些特殊字符(主要来自法语,如“é”、“ç”、“à”等)和 html 标签。 这是我的 json 数据样本:

{
    "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>"
}

想要的结果

{
    "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": "&lt;p&gt;Le cartulaire de 1380-1381 copi&amp;eacute; au XVIIe si&amp;egrave;cle et aujourd&amp;rsquo;hui perdu&lt;strong&gt;*&lt;/strong&gt;.",
        "data2": "&lt;p&gt;&lt;strong&gt;*&lt;/strong&gt; Joseph CUVELIER, &lt;em&gt;Cartulaire de l&amp;rsquo;abbaye du Val-Beno&amp;icirc;t&lt;/em&gt;, Bruxelles, 1906, p. XI-XXVII.&lt;/p&gt;"
    }';
$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&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>"
}

因此,HTML 标签转换得很好。但是法语特殊字符的 HTML 实体留在这里(但是,例如 &amp;eacute; 现在我有 &eacute; )。

问题。 如何将 HTML 实体转换回字符?

您可以在这里在线测试:https://www.tehplayground.com/Z4uB5KIPPo4UQ4h1

非常感谢!

更新:

最后,我的数据比我想象的要复杂。在同一数据中,一些字符被保留为“é”、“à”、“ç”等,其他一些字符被转换为 HTM 实体。所以我可以有这样的东西:

{
    "someData1":
    {
        "data1":
        [
            "ecclésiastique"
        ],
        "data2": "s&amp;eacute;culiers"
    },
    "someData2":
    [
        {
            "anotherData1": "ecclésiastique",
            "anotherData2": "&lt;p&gt;Le cartulaire de 1380-1381 copi&amp;eacute; au XVIIe si&amp;egrave;cle et aujourd&amp;rsquo;hui perdu&lt;strong&gt;*&lt;/strong&gt;.",
            "anotherData3":
            {
                "text1": "texte here",
                "text2": "texte here"
            }
        },
        {
            "anotherData1": "ecclésiastique",
            "anotherData2": "&lt;p&gt;Le cartulaire de 1380-1381 copi&amp;eacute; au XVIIe si&amp;egrave;cle et aujourd&amp;rsquo;hui perdu&lt;strong&gt;*&lt;/strong&gt;.",
            "anotherData3":
            {
                "text1": "texte here",
                "text2": "texte here"
            }
        }
    ]
}

所以,我想我必须 1) 将所有数据转换为 HTML 个实体; 2) 将所有 HTML 个实体转换回字符…

这是我当前的代码:

# Get data

$jsonData = '{
    "someData1":
    {
        "data1":
        [
            "ecclésiastique"
        ],
        "data2": "s&amp;eacute;culiers"
    },
    "someData2":
    [
        {
            "anotherData1": "ecclésiastique",
            "anotherData2": "&lt;p&gt;Le cartulaire de 1380-1381 copi&amp;eacute; au XVIIe si&amp;egrave;cle et aujourd&amp;rsquo;hui perdu&lt;strong&gt;*&lt;/strong&gt;.",
            "anotherData3":
            {
                "text1": "texte here",
                "text2": "texte here"
            }
        },
        {
            "anotherData1": "ecclésiastique",
            "anotherData2": "&lt;p&gt;Le cartulaire de 1380-1381 copi&amp;eacute; au XVIIe si&amp;egrave;cle et aujourd&amp;rsquo;hui perdu&lt;strong&gt;*&lt;/strong&gt;.",
            "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个实体。

但我不知道如何只获取特殊字符。

在线测试:https://www.tehplayground.com/bVo3Jr5O7L9p4MXX

有解决办法。我需要

  1. &amp; 转换为 & 以标准化编码系统;
  2. 将所有适用的字符转换为 HTML 个实体。

有最终代码。非常感谢大家的意见和建议。

完整代码和在线测试在这里:https://www.tehplayground.com/zythX4MUdF3ric4l

array_walk_recursive($data, function(&$item, $key) {
    if(is_string($item)) {
        $item = str_replace("&amp;", "&", $item); // 1. Replace &amp; by &
        $item = html_entity_decode($item); // 2. Convert HTML entities to their corresponding characters
    }
});