0

我正在使用 contenteditable<div>来编辑电子邮件(特别是使用NicEdit)。我希望能够以表单形式提交消息正文,使用 PHP 处理它,并使用mail()函数(或PHPMailer)发送它。

我遇到的问题与特殊字符和编码有关。当一个特殊字符(例如πor á)输入到 div 中时,它保持不变,而不是被转换为类似&pi;or的 html 实体&aacute;。在某些情况下它会被转换,<例如&lt;.

所以在提交表单的时候,PHP接收到的数据是很难处理的。写作

pi is "less than" 2 × pi:
π < 2π

将以下数据放入 contenteditable div

<div>pi is "less than" 2 × pi:</div>
<div>π < 2π</div>

这就是 PHP 收到的内容。但是使用htmlentities()给出

&lt;div&gt;pi is &quot;less than&quot; 2 &times; pi:&lt;/div&gt;
&lt;div&gt;&pi; &lt; 2&pi;&lt;/div&gt;

这是正确的,除了 HTML 标签,所以这个方法似乎没用。最初收到的数据可以很好地插入数据库(我认为),但是当我尝试将其作为电子邮件发送时,编码会混乱。

从我的角度来看,似乎解决方案是对 HTML 标记之外的实体进行编码以获得如下内容:

<div>pi is &quot;less than&quot; 2 &times; pi:</div>
<div>&pi; &lt; 2&pi;</div>

但从谷歌和 StackOverflow 上搜索这似乎是一件坏事。所以我认为我一定在某个时候对编码做错了,无论是在发送电子邮件之前还是在返回原始内容可编辑数据之前。我正在寻找一种可行的解决方案,理想情况下没有像 HTMLPurifier 这样的复杂库。

有任何想法吗?

编辑:当特殊字符不在标签中时,我已经尝试过将特殊字符转换为 html 实体的解决方案。当我尝试输入特殊字符(如π. 但是该链接的答案已被否决,类似的答案说该方法从根本上是错误的。谁能告诉我为什么会这样,为什么我不应该坚持htmlentitiesOutsideHTMLTags

4

1 回答 1

0

只是一个想法:

  • 第 1 步:将您的转换<div> <b></b> </div>为 [div] [b] [/b] [/div]
  • 第 2 步:你的重要性
  • 第 3 步:将您的 [div] [b] [/b] [/div] 转换为<div> <b> </b> </div>

顺便说一句,我认为您可以在步骤 1 之前使用 strip_tags() ...

于 2012-08-03T18:16:11.083 回答