2009-12-10 4 views
66

Я использую TinyMCE, чтобы разрешить минимальное форматирование текста на моем сайте. Из HTML, который был создан, я хотел бы преобразовать его в обычный текст для электронной почты. Я использую класс под названием html2text, но он действительно не хватает поддержки UTF-8, среди прочего. Тем не менее, мне кажется, что он сопоставляет определенные теги HTML с форматированием обычного текста - например, помещает символы подчеркивания вокруг текста, который ранее имел <i> теги в HTML.Преобразование HTML в обычный текст в PHP для электронной почты

Кто-нибудь использует аналогичный подход для преобразования HTML в обычный текст в PHP? И если да: рекомендуете ли вы какие-либо сторонние классы, которые я могу использовать? Или как вам лучше всего решить эту проблему?

+0

См. Также ["HTML для обычного текста (для электронной почты)"] (http://stackoverflow.com/questions/1930297/html-to-plain-text-for-email) – outis

+4

html2text has [ уязвимые ошибки выполнения кода] (http://www.madirish.net/node/225). – Tgr

+0

Для справки, wikipedia [ссылки на опрос] (http://en.wikipedia.org/wiki/HTML_email#cite_note-clickz_data-5), в котором говорилось, что только около 3% людей используют текстовую электронную почту. – Redzarf

ответ

80

Использовать html2text (пример HTML до text), имеющий лицензию под номером Eclipse Public License. Он использует методы DOM PHP для загрузки из HTML, а затем выполняет итерацию по полученному DOM для извлечения простого текста. Использование:

$text = convert_html_to_text($html); 

Хотя неполный, это с открытым исходным кодом, и взносы приветствуются.

Проблемы с другими сценариями преобразования:

  • С html2text (GPL) не EPL-совместимыми.
  • lkessler's link (атрибуция) несовместима с большинством лицензий с открытым исходным кодом.
+1

Отлично, спасибо! – Alex

+1

Первый скрипт выше выпущен под лицензией GPL, который является * не * «некоммерческой» лицензией. В зависимости от контекста это может быть нежелательно, но оно не является «некоммерческим». Вторая ссылка также позволяет коммерческое использование - только с атрибуцией. Это тоже не «некоммерческое». –

+1

@OliverMoran Вы правы, я отредактировал ответ, чтобы более точно отразить их ограничения лицензии. – jevon

11

Существует надежная функция strip_tags. Это не очень, хотя. Это будет только санировать. Вы могли бы объединить его с заменой строки, чтобы получить ваши причудливые подчеркивания.


<?php 
// to strip all tags and wrap italics with underscore 
strip_tags(str_replace(array("<i>", "</i>"), array("_", "_"), $text)); 

// to preserve anchors... 
str_replace("|a", "<a", strip_tags(str_replace("<a", "|a", $text))); 

?> 
+0

Не забывайте, что теги на полосах также удаляют якоря! –

12

Преобразование из HTML в текст с использованием DOMDocument является жизнеспособным решением. Рассмотрим html2text, который требует PHP5:

Что касается UTF-8, то рецензия на "HowTo" страницы состояний:

Собственная поддержка PHP для юникода довольно плохая, и она не всегда корректно обрабатывает utf-8. Хотя сценарий html2text использует безопасные для Unicode методы (без использования модуля mbstring), он не всегда может справиться с собственной обработкой кодировок PHP. PHP действительно не понимает юникод или кодировки, такие как utf-8, и использует базовую кодировку системы, которая, как правило, является одним из семейств ISO-8859. В результате, то, что может выглядеть вам как действительный символ в вашем текстовом редакторе, как в utf-8, так и в однобайтном, вполне может быть неверно истолковано PHP. Поэтому, даже если вы считаете, что кормили допустимого символа в html2text, вы, возможно, не будете.

Автор предлагает несколько подходов к решению этого вопроса и утверждает, что версия 2 HTML2Text (с использованием DOMDocument) поддерживает UTF-8.

Обратите внимание на ограничения для коммерческого использования.

+0

Markdownify больше не поддерживается; онлайн-демонстрация вызывает множество предупреждений и не работает. Новая версия html2text работает для моего письма. Покойный +1 до lkessler. – malcanso

2

Markdownify преобразует HTML в Markdown, систему форматирования с открытым текстом, используемую на этом самом сайте.

+0

Хороший выбор, за исключением того, как он обрабатывает ссылки. Но попробуйте онлайн-демонстрацию, если вы ее рассматриваете. – Redzarf

7

Вы можете использовать рысь с -stdin и -dump вариантов для достижения этой цели:

<?php 
$descriptorspec = array(
    0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
    1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
    2 => array("file", "/tmp/htmp2txt.log", "a") // stderr is a file to write to 
); 

$process = proc_open('lynx -stdin -dump 2>&1', $descriptorspec, $pipes, '/tmp', NULL); 

if (is_resource($process)) { 
    // $pipes now looks like this: 
    // 0 => writeable handle connected to child stdin 
    // 1 => readable handle connected to child stdout 
    // Any error output will be appended to htmp2txt.log 

    $stdin = $pipes[0]; 
    fwrite($stdin, <<<'EOT' 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<title>TEST</title> 
</head> 
<body> 
<h1><span>Lorem Ipsum</span></h1> 

<h4>"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."</h4> 
<h5>"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain..."</h5> 
<p> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque et sapien ut erat porttitor suscipit id nec dui. Nam rhoncus mauris ac dui tristique bibendum. Aliquam molestie placerat gravida. Duis vitae tortor gravida libero semper cursus eu ut tortor. Nunc id orci orci. Suspendisse potenti. Phasellus vehicula leo sed erat rutrum sed blandit purus convallis. 
</p> 
<p> 
Aliquam feugiat, neque a tempus rhoncus, neque dolor vulputate eros, non pellentesque elit lacus ut nunc. Pellentesque vel purus libero, ultrices condimentum lorem. Nam dictum faucibus mollis. Praesent adipiscing nunc sed dui ultricies molestie. Quisque facilisis purus quis felis molestie ut accumsan felis ultricies. Curabitur euismod est id est pretium accumsan. Praesent a mi in dolor feugiat vehicula quis at elit. Mauris lacus mauris, laoreet non molestie nec, adipiscing a nulla. Nullam rutrum, libero id pellentesque tempus, erat nibh ornare dolor, id accumsan est risus at leo. In convallis felis at eros condimentum adipiscing aliquam nisi faucibus. Integer arcu ligula, porttitor in fermentum vitae, lacinia nec dui. 
</p> 
</body> 
</html> 
EOT 
    ); 
    fclose($stdin); 

    echo stream_get_contents($pipes[1]); 
    fclose($pipes[1]); 

    // It is important that you close any pipes before calling 
    // proc_close in order to avoid a deadlock 
    $return_value = proc_close($process); 

    echo "command returned $return_value\n"; 
} 
1

Markdownify работала замечательно для меня! о чем нужно упомянуть: он отлично поддерживает utf-8, что было основной причиной, по которой я искал другое решение, чем html2text (что упоминалось ранее в этом потоке).

0

Я только что нашел функцию PHP «strip_tags()» и ее работу в моем случае.

Я попытался преобразовать следующий HTML:

<p><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 7.5pt;">&nbsp;</span>Many practitioners are optimistic that the eyeglass and contact lens industry will recover from the recent economic storm. Did your practice feel its affects?&nbsp; Statistics show revenue notably declined in 2008 and 2009. But interestingly enough, those that monitor these trends state that despite the industry's lackluster performance during this time, revenue has grown at an average annual rate&nbsp;of 2.2% over the last five years, to $9.0 billion in 2010.&nbsp; So despite the downturn, how were we able to manage growth as an industry?</p> 

После применения strip_tags() функцию, я получил следующий вывод:

&amp;nbsp;Many practitioners are optimistic that the eyeglass and contact lens industry will recover from the recent economic storm. Did your practice feel its affects?&amp;nbsp; Statistics show revenue notably declined in 2008 and 2009. But interestingly enough, those that monitor these trends state that despite the industry&#039;s lackluster performance during this time, revenue has grown at an average annual rate&amp;nbsp;of 2.2% over the last five years, to $9.0 billion in 2010.&amp;nbsp; So despite the downturn, how were we able to manage growth as an industry? 
+2

strip_tags() не будет обрабатывать случай, когда у вас есть несколько элементов на нескольких строках, которые html рассматривается как «inline» и отображает их на нескольких строках. Кроме того, обратный случай - если у вас несколько элементов div в одной строке, они будут разделять теги и конкатенировать содержимое. Я поделился своим опытом здесь: http://stackoverflow.com/questions/1930297/html-to-plain-text-for-email/12563906#12563906 –

+0

Да ..... Я согласен .... Спасибо ...... – sudip

6

Вы можете протестировать эту функцию

function html2text($Document) { 
    $Rules = array ('@<script[^>]*?>.*?</script>@si', 
        '@<[\/\!]*?[^<>]*?>@si', 
        '@([\r\n])[\s][email protected]', 
        '@&(quot|#34);@i', 
        '@&(amp|#38);@i', 
        '@&(lt|#60);@i', 
        '@&(gt|#62);@i', 
        '@&(nbsp|#160);@i', 
        '@&(iexcl|#161);@i', 
        '@&(cent|#162);@i', 
        '@&(pound|#163);@i', 
        '@&(copy|#169);@i', 
        '@&(reg|#174);@i', 
        '@&#(d+);@e' 
      ); 
    $Replace = array ('', 
         '', 
         '', 
         '', 
         '&', 
         '<', 
         '>', 
         ' ', 
         chr(161), 
         chr(162), 
         chr(163), 
         chr(169), 
         chr(174), 
         'chr()' 
       ); 
    return preg_replace($Rules, $Replace, $Document); 
} 
+0

Спасибо за это. Работал отлично для моего использования (конвертирования HTML для RSS-канала) и предоставил простой шаблон для добавления двух дополнительных случаев (’ и —). –

4

я не нашел ни одной из существующих решений фитинговых - простое HTML писем в простые текстовые файлы.

Я открыл этот репозиторий, надеюсь, что это поможет кому-то. лицензии MIT, кстати :)

https://github.com/RobQuistNL/SimpleHtmlToText

Пример:

$myHtml = '<b>This is HTML</b><h1>Header</h1><br/><br/>Newlines'; 
echo (new Parser())->parseString($myHtml); 

возвращается:

**This is HTML** 
### Header ### 


Newlines 
+0

Отмечено как некачественное по длине и содержанию. Не знаю. Возможно, сообщение должно сказать что-то о том, как ваш код может использоваться для ответа на проблему, или, может быть, это должен быть комментарий. Наиболее популярные ответы, похоже, показывают, как решения могут быть вызваны из PHP-кода. –

+0

Прошу прощения за то, что написал эту библиотеку. Я добавил вам небольшой пример, если вы не хотите нажимать на ссылку и смотрите на пример. –

+1

Не пожалеете! :-) Я писал в качестве обозревателя SO. Не то, чтобы я не хотел нажимать на ссылку. Это то, что ответы SO требуют, чтобы каждый из них считался нестандартным. Я не знаю, почему кто-то пропустит ваш ответ кстати. –

1

я пришел вокруг одной и той же проблемы, как ОП, и пытаются некоторые решения от верхние ответы выше не показали работу для моих сценариев. Посмотрите, почему в конце.

Вместо этого, я нашел этот полезный скрипт, чтобы избежать путаницы, давайте называть его html2text_roundcube, доступен под лицензией GPL:

Это на самом деле это обновленная версия уже упомянутого сценария - http://www.chuggnutt.com/html2text.php - обновляется по почте RoundCube.

Использование:

$h2t = new \Html2Text\Html2Text('Hello, &quot;<b>world</b>&quot;'); 
echo $h2t->getText(); // prints Hello, "WORLD" 

Почему html2text_roundcube оказались лучше, чем другие:

  • Script http://www.chuggnutt.com/html2text.php не работают из коробки для случаев с особыми HTML кодов/названий (например &auml;) , или непарные котировки (например, <p>25" Monitor</p>).

  • Сценарий https://github.com/soundasleep/html2text не имел возможности скрывать или группировать ссылки в конце текста, делая обычную HTML-страницу выглядящей раздутой со ссылками в текстовом формате; настройка кода для специального рассмотрения того, как делается преобразование, не так прямолинейна, как простое редактирование массива в html2text_roundcube.

-1
public function planText($text) 
{ 
    $text = strip_tags($text, '<br><p><li>'); 
    $text = preg_replace ('/<[^>]*>/', PHP_EOL, $text); 

    return $text; 
} 

$text = "string 1<br>string 2<br/><ul><li>string 3</li><li>string 4</li></ul><p>string 5</p>";

echo planText($text);

выход
Строка 1
Строка 2
Строка 3
Строка 4
строка 5

+1

не добавляйте только ответ. Пожалуйста, добавьте текст, почему это ответ – Himanth

+0

отредактирован ...................... –

Смежные вопросы