将所有UTF8编码的HTML源代码存储在MariaDB / MySQL UTF-8表中,而不会出现“

问题描述 投票:0回答:3

我正在使用PHP将HTML5代码存储在Maria数据库中。在将HMTL5内容存储在数据库中之前,我使用

解码实体
$Uncoded_content = mysqli_real_escape_string($database_link, html_entity_decode($HTML5_content,ENT_QUOTES | ENT_HTML5 ,'UTF-8')); 

其中$ HTML_content是HTML5源代码,带有编码的实体。

我突然发疯了,几个月后存储各种字符(包括“ 我在“ ,Web浏览器会使某些文本消失。显然,浏览器将“

这里是HTML5源代码的内容,因为它存储在数据库中。

<table cellpadding="2" cellspacing="0" width="570">
  <tr>
    <td>Zona lumínica</td>
    <td>Superficie del cartel</td>
    <td>Luminancia máxima (cd/m2)</td>
  </tr>
  <tr>
    <td>E1</td>
    <td>n/a</td>
    <td>50</td>
  </tr>
  <tr>
    <td>E2</td>
    <td>n/a</td>
    <td>400</td>
  </tr>
  <tr>
    <td rowspan="3">E3</td>
    <td>S
      <2m<sup>2</sup>
    </td>
    <td>800</td>
  </tr>
  <tr>
    <td>2
      <S≤10m<sup>2</sup>
    </td>
    <td>600</td>
  </tr>
  <tr>
    <td>S>10m<sup>2</sup></td>
    <td>400</td>
  </tr>
  <tr>
    <td rowspan="4">E4</td>
    <td>S
      <0,5m<sup>2</sup>
    </td>
    <td>1.000</td>
  </tr>
  <tr>
    <td>0,5
      <S≤2m<sup>2</sup>
    </td>
    <td>800</td>
  </tr>
  <tr>
    <td>2
      <S≤10m<sup>2</sup>
    </td>
    <td>600</td>
  </tr>
  <tr>
    <td>S>10m<sup>2</sup></td>
    <td>400</td>
  </tr>
</table>
<p><br /><br /></p>
<table cellpadding="2" cellspacing="0" width="570">
  <tr>
    <td>Zona lumínica</td>
    <td>Superficie del cartel</td>
    <td>Luminancia máxima (cd/m2)</td>
  </tr>
  <tr>
    <td>E1</td>
    <td>n/a</td>
    <td>50</td>
  </tr>
  <tr>
    <td>E2</td>
    <td>n/a</td>
    <td>400</td>
  </tr>
  <tr>
    <td rowspan="3">E3</td>
    <td>S
      < 2m<sup>2</sup>
    </td>
    <td>800</td>
  </tr>
  <tr>
    <td>2
      < S ≤ 10m<sup>2</sup>
    </td>
    <td>600</td>
  </tr>
  <tr>
    <td>S > 10m<sup>2</sup></td>
    <td>400</td>
  </tr>
  <tr>
    <td rowspan="4">E4</td>
    <td>S
      < 0,5m<sup>2</sup>
    </td>
    <td>1.000</td>
  </tr>
  <tr>
    <td>0,5
      < S ≤ 2m<sup>2</sup>
    </td>
    <td>800</td>
  </tr>
  <tr>
    <td>2
      < S ≤ 10m<sup>2</sup>
    </td>
    <td>600</td>
  </tr>
  <tr>
    <td>S > 10m<sup>2</sup></td>
    <td>400</td>
  </tr>
</table>

两个表是相同的,除了第二个表在每个“

当我做一个简单的“回声”

echo $HTML5_source_content

来自该内容的PHP(采用HTML5结构),显示的第一个表隐藏了一些文本。正确显示了第二张表。为避免此问题,我尝试:

echo htmlentities($HTML5_source_content, ENT_QUOTES | ENT_HTML5, "UTF-8"); 

但是在这种情况下,浏览器不会显示已解析的HTML源,而是显示源本身(页面的其余部分显示为HTML)。我甚至尝试使用“ htmlspecialchars”,但结果相同,即源代码。

我忘记了什么?我的错误在哪里?

[请提供任何帮助

谢谢

php html utf-8 mariadb html-entities
3个回答
1
投票

这似乎并不容易,但是我参考了其他想法来解决类似的问题,所以我编写了此脚本,这解决了我将所有HTML内容存储到MariaDB / MySQL数据库(UTF-8表)并检索显示为UTF-8的麻烦。网页没有问题。就我而言,用户从文字处理程序中粘贴文本,很多时候它们都带有印刷字符(双引号和单引号),我们用非印刷字符替换它们,以便用户也可以搜索它们。

function PREPARE_TO_STORE($HTML_Code)
{
    $V_Matches = Array();
    $Token = '###TOKEN_HTML###';
    // We will replace typographic characters by non typographical ones and will remain "<" as an HTML entity
    $V_Search  = array( "‘", "’", "”", "“", "″", "<");  
    $V_Replace = array( "'", "'", '"', '"', '"', "&lt;");

    preg_match_all("@<[^>]*>@", $HTML_Code, $V_Matches);
    $V_Content = preg_replace("@(<[^>]*>)@", $Token, $HTML_Code); // $V_Content will contain string between HTML tags
    $V_Content = explode($Token, $V_Content); // Splits HTML from content 

    for ($i=0; $i<count($V_Content); $i++) // Decoding all entities
    {
       $V_Content[$i] = html_entity_decode($V_Content[$i], ENT_QUOTES | ENT_HTML5, "UTF-8");
       $V_Content[$i] = str_replace($V_Search, $V_Replace, $V_Content[$i]);
    }
    $V_Content = join($Token, $V_Content); // Join again HTML tags with content        

    for ($i=0; $i<count($V_Matches[0]); $i++)  
        $V_Content = preg_replace("@$Token@", $V_Matches[0][$i], $V_Content, 1);
    return $V_Content;
}

$HTML_to_store_in_db = mysqli_real_escape_string($link,  PREPARE_TO_STORE($anuncio));

// Here your own code to store $HTML_to_store_in_db in your database

要显示我们存储的HTML代码,只需执行以下操作:

echo $HTML_data_retrieved_from_DB;

但是如果您的网页不在UTF-8中,则可能需要这样做

echo htmlspecialchars($HTML_data_retrieved_from_DB, ENT_QUOTES | ENT_HTML5, "webpage_coding");  // "webpage_coding" is your character coding, in our case, UTF-8

当然,欢迎提出任何建议,问题或修正

谢谢大家


0
投票

这不是奇怪的行为;这就是您要求计算机执行的操作。您要求它存储一个HTML文档,然后要进行搜索工作,您要求它解码HTML文档中的all实体,从而导致(在某些情况下)文档含义发生更改,并导致(在某些情况下)最坏的情况)您的文档将失效。

不要在您的数据库中存储HTML。您应该生成HTML用于呈现,而不是用于存储。语义存储数据。 (MySQL具有文本搜索功能; HTML使其变得harder。)

以演示文稿标记格式存储,并(通过解码实体)剥离所有上下文信息,使您剩下无法可靠使用的数据。当拥有&lt;时,现在有了<,在批量解码所有实体之前,无法知道是哪一个。

您将牛奶放入水中并搅拌。你不能把水拿回来。

您需要了解您的方法从根本上来说是有缺陷的。您应该检查决策过程中的每个步骤,然后再次向自己解释。

然后在数据库中存储漂亮的普通字符串,而不是HTML。

如果由于某种原因而不可能,请至少停止解码实体。这将使搜索更加困难,因为简单的文本搜索是不够的,但是实际上您的搜索例程应该无论如何都可以识别HTML,以便获得正确的结果,因此您也可以正确地做到这一点。” >


tl; dr:

很明显,浏览器将“

因为是。这就是<在HTML中所做的。

&lt;很好,但是随后您取消了转义。


0
投票

如果您想按原样保存作者的HTML代码,并希望将其作为“有效的” HTML代码输出到页面上,那么您就不会使用任何HTML编码/解码功能。将接收到的内容“按原样”保存在数据库中,然后通常使用echo将HTML按原样输出,就像没有HTML代码的“正常”内容一样。请记住,这是一个巨大的安全问题,因为作者可以使用其HTML编辑器软件编写他们喜欢的任何HTML代码。他们可以添加任何HTML代码,包括javascript代码。您已被警告!

© www.soinside.com 2019 - 2024. All rights reserved.