我正在使用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”,但结果相同,即源代码。
我忘记了什么?我的错误在哪里?
[请提供任何帮助
谢谢
这似乎并不容易,但是我参考了其他想法来解决类似的问题,所以我编写了此脚本,这解决了我将所有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( "'", "'", '"', '"', '"', "<");
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
当然,欢迎提出任何建议,问题或修正
谢谢大家
这不是奇怪的行为;这就是您要求计算机执行的操作。您要求它存储一个HTML文档,然后要进行搜索工作,您要求它解码HTML文档中的all实体,从而导致(在某些情况下)文档含义发生更改,并导致(在某些情况下)最坏的情况)您的文档将失效。
不要在您的数据库中存储HTML。您应该生成HTML用于呈现,而不是用于存储。语义存储数据。 (MySQL具有文本搜索功能; HTML使其变得harder。)
以演示文稿标记格式存储,并(通过解码实体)剥离所有上下文信息,使您剩下无法可靠使用的数据。当拥有<
时,现在有了<
,在批量解码所有实体之前,无法知道是哪一个。
您将牛奶放入水中并搅拌。你不能把水拿回来。
您需要了解您的方法从根本上来说是有缺陷的。您应该检查决策过程中的每个步骤,然后再次向自己解释。
然后在数据库中存储漂亮的普通字符串,而不是HTML。
如果由于某种原因而不可能,请至少停止解码实体。这将使搜索更加困难,因为简单的文本搜索是不够的,但是实际上您的搜索例程应该无论如何都可以识别HTML,以便获得正确的结果,因此您也可以正确地做到这一点。” >
tl; dr:
很明显,浏览器将“
因为是。这就是
<
在HTML中所做的。
<
很好,但是随后您取消了转义。
如果您想按原样保存作者的HTML代码,并希望将其作为“有效的” HTML代码输出到页面上,那么您就不会使用任何HTML编码/解码功能。将接收到的内容“按原样”保存在数据库中,然后通常使用echo
将HTML按原样输出,就像没有HTML代码的“正常”内容一样。请记住,这是一个巨大的安全问题,因为作者可以使用其HTML编辑器软件编写他们喜欢的任何HTML代码。他们可以添加任何HTML代码,包括javascript代码。您已被警告!