HTML-безопасное завершение длинных строк - PullRequest
6 голосов
/ 31 марта 2011

У меня проблемы с отправкой электронных писем в формате HTML с длинными строками текста. Редактор WYSIWYG (FCKEditor 2.5), используемый на сайте, продолжает удалять все символы \n в определенных браузерах, включая IE и Chrome. Результатом является электронное письмо с одной огромной строкой текста. Это не было бы проблемой, если бы почтовые клиенты не переносили строки длиной более 998 символов, вставляя в них ! \n. Конечно, они почти всегда оказываются в самых неудачных местах, ломая HTML-теги и выглядя неприятно в самом контенте.

Моим первоначальным решением было добавить перевод строки после каждого тега HTML или через каждые от 900 до 990 символов. Это регулярное выражение, с которым я закончил:

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

Однако, когда есть строки, которые вообще не содержат никаких тегов, часть, соответствующая пробелу, никогда не запускается. Но если я уберу > с его начала, он начнет ломать теги.

Есть ли лучший способ сделать это, чем регулярное выражение, или это исцеление можно вылечить?

РЕДАКТИРОВАНИЕ: Предел длины строки в 1000 символов определен в RFC 821 .

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

После моего комментария я публикую это, поскольку мне удалось запустить тест.

tidy :: repairString должны делать работу просто отлично, лучше, чем любое решение для регулярных выражений.

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

Адаптируйте параметр Charset (3-й) к вашим потребностям.

Для этого опция очистки не нужна, я ошибся в своем комментарии.

0 голосов
/ 31 марта 2011

Если я все правильно понимаю, вам не нужно беспокоиться о строках, которые вообще не содержат HTML - их можно оставить для обработки почтовыми клиентами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...