Używam TinyMCE, aby umożliwić minimalne formatowanie tekstu w mojej witrynie. Z utworzonego kodu HTML chciałbym przekonwertować go na zwykły tekst do wiadomości e-mail. Używałem klasy o nazwie html2text , ale naprawdę brakuje jej między innymi obsługi UTF-8. Jednak podoba mi się to, że mapuje pewne znaczniki HTML na formatowanie zwykłego tekstu - na przykład umieszczanie podkreśleń wokół tekstu, który wcześniej miał znaczniki <i> w HTML.
Czy ktoś stosuje podobne podejście do konwersji HTML na zwykły tekst w PHP? A jeśli tak: czy polecacie jakieś zajęcia osób trzecich, z których mogę skorzystać? Albo jak najlepiej rozwiązać ten problem?
Odpowiedzi:
Użyj html2text (przykład HTML do tekstu ), na licencji Eclipse Public License . Używa metod DOM PHP do ładowania z HTML, a następnie iteruje po wynikowym DOM, aby wyodrębnić zwykły tekst. Stosowanie:
// when installed using the Composer package $text = Html2Text\Html2Text::convert($html); // usage when installed using html2text.php require('html2text.php'); $text = convert_html_to_text($html);
Chociaż jest niekompletny, ma otwarty kod źródłowy i mile widziany jest wkład.
Problemy z innymi skryptami konwersji:
źródło
oto inne rozwiązanie:
$cleaner_input = strip_tags($text);
Aby zapoznać się z innymi odmianami funkcji odkażania, zobacz:
https://github.com/ttodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php
źródło
$ClearText = preg_replace( "/\n\s+/", "\n", rtrim(html_entity_decode(strip_tags($HTMLText))) );
Konwersja z HTML do tekstu za pomocą DOMDocument to realne rozwiązanie. Rozważ HTML2Text, który wymaga PHP5:
W odniesieniu do UTF-8, opis na stronie „Howto” stwierdza:
Autor podaje kilka podejść do rozwiązania tego problemu i stwierdza, że wersja 2 HTML2Text (używająca DOMDocument) obsługuje UTF-8.
Zwróć uwagę na ograniczenia dotyczące użytku komercyjnego.
źródło
Jest sprawdzona funkcja strip_tags . Ale to nie jest ładne. To tylko odkaża. Możesz połączyć to z wymianą ciągu, aby uzyskać fantazyjne podkreślenia.
<?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))); ?>
źródło
Aby to osiągnąć, możesz użyć lynx z opcjami -stdin i -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"; }
źródło
Możesz przetestować tę funkcję
function html2text($Document) { $Rules = array ('@<script[^>]*?>.*?</script>@si', '@<[\/\!]*?[^<>]*?>@si', '@([\r\n])[\s]+@', '@&(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); }
źródło
Nie znalazłem żadnego z istniejących rozwiązań - proste e-maile w formacie HTML do zwykłych plików tekstowych.
Otworzyłem to repozytorium, mam nadzieję, że to komuś pomoże. Nawiasem mówiąc, licencja MIT :)
https://github.com/RobQuistNL/SimpleHtmlToText
Przykład:
$myHtml = '<b>This is HTML</b><h1>Header</h1><br/><br/>Newlines'; echo (new Parser())->parseString($myHtml);
zwroty:
**This is HTML** ### Header ### Newlines
źródło
Jeśli chcesz przekonwertować znaki specjalne HTML, a nie tylko je usunąć, a także usunąć rzeczy i przygotować się na zwykły tekst, to rozwiązanie zadziałało dla mnie ...
function htmlToPlainText($str){ $str = str_replace(' ', ' ', $str); $str = html_entity_decode($str, ENT_QUOTES | ENT_COMPAT , 'UTF-8'); $str = html_entity_decode($str, ENT_HTML5, 'UTF-8'); $str = html_entity_decode($str); $str = htmlspecialchars_decode($str); $str = strip_tags($str); return $str; } $string = '<p>this is ( ) a test</p> <div>Yes this is! & does it get "processed"? </div>' htmlToPlainText($string); // "this is ( ) a test. Yes this is! & does it get processed?"`
html_entity_decode z / ENT_QUOTES | ENT_XML1 konwertuje rzeczy takie
'
jak&
htmlspecialchars_decode konwertuje rzeczy takie jak html_entity_decode konwertuje rzeczy takie jak,'<
a strip_tags usuwa wszelkie pozostałe tagi HTML.źródło
Markdownify konwertuje HTML do Markdown, systemu formatowania zwykłego tekstu używanego w tej witrynie.
źródło
public function plainText($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);
ciąg wyjściowy 1
ciąg 2
ciąg 3
ciąg 4
ciąg 5
źródło
Natknąłem się na ten sam problem, co w przypadku OP, i wypróbowanie niektórych rozwiązań z powyższych najlepszych odpowiedzi nie sprawdziło się w moich scenariuszach. Zobacz, dlaczego na końcu.
Zamiast tego znalazłem ten pomocny skrypt, aby uniknąć nieporozumień, nazwijmy go
html2text_roundcube
, dostępny na GPL:W rzeczywistości jest to zaktualizowana wersja wspomnianego już skryptu -
http://www.chuggnutt.com/html2text.php
- zaktualizowana pocztą RoundCube.Stosowanie:
$h2t = new \Html2Text\Html2Text('Hello, "<b>world</b>"'); echo $h2t->getText(); // prints Hello, "WORLD"
Dlaczego
html2text_roundcube
okazał się lepszy od innych:Skrypt
http://www.chuggnutt.com/html2text.php
nie działał od razu w przypadku przypadków ze specjalnymi kodami / nazwami HTML (np.ä
) Lub niesparowanymi cudzysłowami (np<p>25" Monitor</p>
.).Skrypt
https://github.com/soundasleep/html2text
nie miał opcji ukrywania lub grupowania linków na końcu tekstu, przez co zwykła strona HTML wyglądała na rozdętą linkami w formacie zwykłego tekstu; dostosowywanie kodu do specjalnego traktowania sposobu przeprowadzania transformacji nie jest tak proste, jak zwykła edycja tablicy w programiehtml2text_roundcube
.źródło
Właśnie znalazłem funkcję PHP "strip_tags ()" i działa ona w moim przypadku.
Próbowałem przekonwertować następujący HTML:
<p><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 7.5pt;"> </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? 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 of 2.2% over the last five years, to $9.0 billion in 2010. So despite the downturn, how were we able to manage growth as an industry?</p>
Po zastosowaniu funkcji strip_tags () otrzymałem następujący wynik:
&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?&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?
źródło
Jeśli nie chcesz całkowicie usuwać tagów i zachować zawartość wewnątrz tagów, możesz użyć
DOMDocument
i wyodrębnićtextContent
węzeł główny w następujący sposób:function html2text($html) { $dom = new DOMDocument(); $dom->loadHTML("<body>" . strip_tags($html, '<b><a><i><div><span><p>') . "</body>"); $xpath = new DOMXPath($dom); $node = $xpath->query('body')->item(0); return $node->textContent; // text } $p = 'this is <b>test</b>. <p>how are <i>you?</i>. <a href="#">I\'m fine!</a></p>'; print html2text($p); // this is test. how are you?. I'm fine!
Jedną z zalet tego podejścia jest to, że nie wymaga żadnych zewnętrznych pakietów.
źródło
W przypadku tekstów w utf-8 działało dla mnie mb_convert_encoding. Aby przetworzyć wszystko bez względu na błędy, użyj znaku „@”.
Podstawowy kod, którego używam to:
$dom = new DOMDocument(); @$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $body = $dom->getElementsByTagName('body')->item(0); echo $body->textContent;
Jeśli chcesz czegoś bardziej zaawansowanego, możesz iteracyjnie analizować węzły, ale napotkasz wiele problemów z białymi znakami.
Zaimplementowałem konwerter na podstawie tego, co tu mówię. Jeśli jesteś zainteresowany, możesz go pobrać z git https://github.com/kranemora/html2text
Może służyć jako odniesienie do twojego
Możesz go używać w ten sposób:
$html = <<<EOF <p>Welcome to <strong>html2text<strong></p> <p>It's <em>works</em> for you?</p> EOF; $html2Text = new \kranemora\Html2Text\Html2Text; $text = $html2Text->convert($html);
źródło