HTML安全包装长行

时间:2011-03-31 11:11:24

标签: php regex email

我在发送包含长行文字的HTML电子邮件时遇到问题。网站上使用的WYSIWYG编辑器(FCKEditor 2.5)不断删除某些浏览器上的所有\n个字符,包括IE和Chrome。结果是一封包含大量文本的电子邮件。如果不是电子邮件客户端通过在其中插入! \n来包装超过998个字符的行,则这不会成为问题。当然,这些几乎总是在最不幸的地方结束,破坏HTML标签并在内容本身看起来很讨厌。

我最初的解决方案是在每个HTML标记后或每900到990个字符后添加换行符。这是我最终得到的正则表达式:

 return preg_replace("/(<\/[^\>]+>|<[^\>]+\/>|>[^<]{900,990}\s)(\n)*/","$1\n",$str);

但是,如果有些行根本不包含任何标记,则永远不会触发空白匹配部分。但是,如果我从它开始删除>,它就会开始破坏标记。

有没有比正则表达式更好的方法来做到这一点,还是可以治愈这个正则表达式?

编辑: 1000字符行长度限制在RFC 821中定义。

2 个答案:

答案 0 :(得分:3)

根据我的评论,我发布了这个,因为我能够进行测试。

tidy::repairString应该做得很好,比任何正则表达式解决方案更好。

$content = "<html>......</html>";
$oTidy = new tidy();
$content = $oTidy->repairString($content,
    array("show-errors" => 0, "show-warnings" => false),
    "utf8"
);

根据您的需要调整Charset参数(第3个)。

干净的选项是不必要的,我的评论错了。

答案 1 :(得分:0)

如果我理解了所有内容,您根本不需要关注不包含HTML的行 - 这些可以由电子邮件客户端处理。