HTML को ई-मेल के लिए PHP में सादे पाठ में बदलना


80

मैं अपनी साइट के भीतर पाठ के न्यूनतम प्रारूपण की अनुमति देने के लिए टिनीएमसीई का उपयोग करता हूं। जो HTML निर्मित है, मैं उसे ई-मेल के लिए सादे पाठ में बदलना चाहूंगा। मैं html2text नामक एक वर्ग का उपयोग कर रहा हूं , लेकिन यह वास्तव में UTF-8 समर्थन की कमी है, अन्य चीजों के बीच। हालाँकि, मैं यह पसंद करता हूं कि यह कुछ HTML टैग्स को सादे टेक्स्ट फॉर्मेटिंग में मैप करता है - जैसे कि टेक्स्ट के आसपास अंडरस्कोर लगाना जो पहले HTML में <i> टैग था।

क्या कोई PHP में सादे पाठ में HTML परिवर्तित करने के लिए एक समान दृष्टिकोण का उपयोग करता है? और यदि ऐसा है: क्या आप किसी भी तृतीय-पक्ष कक्षाओं की सलाह देते हैं जो मैं उपयोग कर सकता हूं? या आप इस मुद्दे से कैसे निपटेंगे?




संदर्भ के लिए, विकिपीडिया एक सर्वेक्षण से लिंक करता है जिसने कहा कि केवल 3% लोग केवल-पाठ ईमेल का उपयोग करते हैं।
Redzarf

8
@Redzarf यह इन 3% के बारे में नहीं है। यदि आप अपने ईमेल को सीधे स्पैम फ़ोल्डर में नहीं चाहते हैं तो एक सादा पाठ भाग जोड़ना एक बहुत अच्छा विचार है। इसके अलावा, ये 3% शायद हल्के मोबाइल ग्राहकों को ध्यान में नहीं रखते हैं। अंतिम लेकिन कम से कम नहीं: 3% अधिक है कि 0%, जो आपको इसे गंभीरता से विचार करना चाहिए।
निन्ज

@Ninj मैंने अभी जाँच की और सर्वेक्षण २००२ से था, इसलिए तब से चीजें बदल गई होंगी (हालांकि मुझे अभी भी लगता है कि ३% शायद सही के बारे में है।) स्पैम मुद्दे के बारे में अच्छी बात - बाद में पढ़ने वाले किसी भी व्यक्ति के लिए जो स्पैम के बारे में चिंतित है। मैंने पाया कि यह टूल बहुत बढ़िया था: port25.com/support/authentication-center/email-verification
Redzarf

जवाबों:


99

एक्लिप्स पब्लिक लाइसेंस के तहत लाइसेंस प्राप्त HTML2text (उदाहरण के लिए HTML से पाठ ) का उपयोग करें । यह HTML से लोड करने के लिए PHP के DOM के तरीकों का उपयोग करता है, और फिर सादे पाठ को निकालने के लिए परिणामी DOM पर पुनरावृत्ति करता है। उपयोग:

// 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);

हालांकि अधूरा है, यह खुला स्रोत है और योगदान का स्वागत है।

अन्य रूपांतरण लिपियों के मुद्दे:


1
पहले स्क्रिप्ट ऊपर GPL के अंतर्गत जारी किया जाता है, जो है नहीं एक "गैर वाणिज्यिक" लाइसेंस। संदर्भ के आधार पर यह अवांछनीय हो सकता है, लेकिन यह "गैर-वाणिज्यिक" नहीं है। दूसरा लिंक भी व्यावसायिक उपयोग की अनुमति देता है - सिर्फ अटेंशन के साथ। यह "गैर-वाणिज्यिक" भी नहीं है।
ओलिवर मोरन

1
@OliverMoran आप सही हैं, मैंने उनके लाइसेंस सीमाओं को प्रतिबिंबित करने के लिए उत्तर को अधिक सटीक रूप से संपादित किया है।
जेवॉन

शुक्रिया @ जेवॉन, मैंने आपके काम को अपने प्रोजेक्ट में शामिल किया और यह बहुत अच्छा काम करता है! दुर्भाग्य से, इसने मेरी आउटलुक समस्या ( stackoverflow.com/questions/19135443/… ) को हल करने में मदद नहीं की, लेकिन मुझे इस तरह से स्वच्छ परिणाम मिले।
निन्ज

लिंक टूट गया। नीचे मतदान।
सिबिधरन

कृपया स्पष्ट करें, लेकिन कौन पता लगाएगा कि कोई व्यक्ति जीएलपी के तहत उपयोग कर रहा है या नहीं?
मिगुएल

21

यहाँ एक और उपाय है:

$cleaner_input = strip_tags($text);

स्वच्छता कार्यों के अन्य रूपों के लिए, देखें:

https://github.com/ttodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php


13
बेहतर संस्करण$ClearText = preg_replace( "/\n\s+/", "\n", rtrim(html_entity_decode(strip_tags($HTMLText))) );
mAsT3RpEE

1
यह इतना सरल है और किसी अन्य पुस्तकालय की आवश्यकता नहीं है। यह भी बहुत अच्छी तरह से काम कर रहा है .......... :)
मिली

14

DOMDocument का उपयोग करके HTML से पाठ में परिवर्तित करना एक व्यवहार्य समाधान है। HTML2Text पर विचार करें, जिसके लिए PHP5 की आवश्यकता है:

UTF-8 के बारे में, "हाउटो" पेज पर लिखा गया है:

यूनिकोड के लिए PHP का अपना समर्थन काफी खराब है, और यह हमेशा utf-8 को सही ढंग से नहीं संभालता है। यद्यपि html2text स्क्रिप्ट यूनिकोड-सुरक्षित विधियों (mbstring मॉड्यूल की आवश्यकता के बिना) का उपयोग करती है, लेकिन यह हमेशा PHP के एन्कोडिंग के स्वयं के संचालन से सामना नहीं कर सकता है। PHP वास्तव में utf-8 की तरह यूनिकोड या एनकोडिंग को नहीं समझता है, और सिस्टम के बेस एन्कोडिंग का उपयोग करता है, जो ISO-8859 परिवार में से एक है। परिणामस्वरूप, आपके टेक्स्ट एडिटर में एक मान्य चरित्र की तरह जो आपको utf-8 या सिंगल-बाइट में दिखता है, उसे PHP द्वारा गलत तरीके से समझा जा सकता है। तो भले ही आपको लगता है कि आप HTML2text में एक वैध चरित्र को खिला रहे हैं, आप अच्छी तरह से नहीं हो सकते हैं।

लेखक इसे हल करने के लिए कई दृष्टिकोण प्रदान करता है और बताता है कि HTML2Text (DOMDocument का उपयोग करके) के संस्करण 2 में UTF-8 समर्थन है।

व्यावसायिक उपयोग के लिए प्रतिबंधों पर ध्यान दें।


अब मार्कडाउन का रखरखाव नहीं किया जाता है; ऑनलाइन डेमो कई चेतावनी फेंकता है और काम नहीं करता है। Html2text का नया संस्करण मेरे ईमेल के लिए काम करता है। Lkessler को एक लेट +1।
malcanso

13

भरोसेमंद पट्टी_टैग समारोह है। हालांकि यह सुंदर नहीं है। यह केवल स्वच्छता होगा। आप इसे अपने फैंसी अंडरस्कोर प्राप्त करने के लिए एक स्ट्रिंग के साथ जोड़ सकते हैं।


<?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)));

?>

यह मत भूलो कि स्ट्रिप टैग भी एंकर हटाते हैं!
एलिक्स एक्सल

9

आप इसे प्राप्त करने के लिए -stdin और -dump विकल्पों के साथ lynx का उपयोग कर सकते हैं:

<?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";
}

8

आप इस फ़ंक्शन का परीक्षण कर सकते हैं

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);
}

इसके लिए धन्यवाद। मेरे उपयोग के लिए बहुत अच्छा काम किया (HTML को RSS फ़ीड के लिए परिवर्तित करना), और दो अतिरिक्त मामलों (& rsquo; और & mdash;) को जोड़ने के लिए एक सरल टेम्पलेट प्रदान किया।
एलन एम।

6

मुझे मौजूदा समाधानों में से कोई भी उपयुक्त नहीं मिला - साधारण 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

लंबाई और सामग्री के लिए निम्न-गुणवत्ता के रूप में चिह्नित किया गया। मुझे नही पता। हो सकता है कि पोस्ट को इस बारे में कुछ कहना चाहिए कि समस्या का जवाब देने के लिए आपके कोड का उपयोग कैसे किया जा सकता है, या शायद यह एक टिप्पणी होनी चाहिए। सबसे लोकप्रिय उत्तर यह दिखाते हैं कि PHP कोड के भीतर से समाधान कैसे लाया जा सकता है।
बिल बेल

मुझे उस पुस्तकालय को लिखने के लिए खेद है। मैंने आपके लिए एक छोटा सा उदाहरण जोड़ा है यदि आप लिंक पर क्लिक नहीं करना चाहते हैं और उदाहरण देखें ..
Rob

2
क्षमा करें! :-) मैं एक एसओ समीक्षक के रूप में लिख रहा था। ऐसा नहीं है कि मैं लिंक पर क्लिक नहीं करना चाहता था। यह है कि एसओ जवाब है कि आवश्यकता होती है कि एक घटिया माना जाता है कि करते हैं। मुझे पता है कि कोई भी आपके उत्तर को संयोगवश क्यों वोट देगा।
बिल बेल

4

यदि आप HTML विशेष वर्णों को परिवर्तित करना चाहते हैं और न केवल उन्हें और साथ ही पट्टी चीजों को हटा दें और सादे पाठ के लिए तैयार करें यह मेरे लिए काम किया गया समाधान था ...

function htmlToPlainText($str){
    $str = str_replace('&nbsp;', ' ', $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 (&nbsp;) a test</p>
<div>Yes this is! &amp; does it get "processed"? </div>'

htmlToPlainText($string);
// "this is ( ) a test. Yes this is! & does it get processed?"`

html_entity_decode w / ENT_QUOTES | ENT_XML1 HTMLspecialchars_decode जैसी चीज़ों को &#39; धर्मान्तरित करता है जैसे &amp; html_entity_decode चीज़ों को रूपांतरित करता है '&lt; और strip_tags किसी भी HTML टैग को हटा देता है।


3

Markdownify HTML को Markdown में परिवर्तित करता है, यह बहुत ही साइट पर उपयोग किया जाने वाला एक सादा पाठ स्वरूपण प्रणाली है।


एक अच्छा विकल्प, सिवाय इसके कि यह लिंक कैसे संभालता है। लेकिन अगर आप इस पर विचार कर रहे हैं तो ऑनलाइन डेमो आज़माएं।
Redzarf

3
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);

आउटपुट
स्ट्रिंग 1
स्ट्रिंग 2
स्ट्रिंग 3
स्ट्रिंग 4
स्ट्रिंग ५


1
सिर्फ उत्तर न जोड़ें। कृपया पाठ जोड़ें कि यह उत्तर क्यों है
हिमंत

2

मैं ओपी के रूप में एक ही समस्या के आसपास आया था, और ऊपर दिए गए शीर्ष उत्तरों से कुछ समाधानों की कोशिश करना मेरे परिदृश्यों के लिए काम नहीं करता था। आखिर क्यों देखें।

इसके बजाय, मुझे यह उपयोगी स्क्रिप्ट मिली, भ्रम से बचने के लिए आइए इसे html2text_roundcubeGPL के तहत उपलब्ध करें :

यह वास्तव में पहले से उल्लेख की गई स्क्रिप्ट का अपडेटेड संस्करण है - http://www.chuggnutt.com/html2text.php- राउंडक्यूब मेल द्वारा अपडेट किया गया है।

उपयोग:

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

html2text_roundcubeदूसरों से बेहतर क्यों साबित हुए:

  • स्क्रिप्ट http://www.chuggnutt.com/html2text.phpविशेष HTML कोड / नाम (जैसे &auml;), या अनपेक्षित उद्धरण (जैसे <p>25" Monitor</p>) वाले मामलों के लिए बॉक्स से बाहर काम नहीं करती थी ।

  • https://github.com/soundasleep/html2textपाठ के अंत में लिंक को छिपाने या समूह बनाने के लिए स्क्रिप्ट का कोई विकल्प नहीं था, सामान्य HTML पृष्ठ को पाठ-सादे प्रारूप में लिंक के साथ फूला हुआ दिखता है; रूपांतरण कैसे किया जाता है, इसके विशेष उपचार के लिए कोड को कस्टमाइज़ करना केवल एक सरणी को संपादित करने के रूप में सीधे आगे नहीं है html2text_roundcube


1

मैंने अभी-अभी एक PHP फ़ंक्शन "स्ट्रिप_टैग्स ()" और इसके मामले में काम कर रहा है।

मैंने निम्नलिखित 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?

3
स्ट्रिप_टैग () एक ऐसे मामले को हैंडल नहीं करेगा जहां आपके पास कई लाइनों पर कई तत्व हैं जो HTML द्वारा 'इनलाइन' के रूप में माना जाता है और उन्हें कई लाइनों पर प्रदर्शित करेगा। इसके अलावा, रिवर्स केस - यदि आपके पास एक लाइन पर कई div एलिमेंट्स हैं, तो यह टैग्स को स्ट्रिप कर देगा और कंटेंट को अलग कर देगा। मैंने अपना अनुभव यहां साझा किया है: stackoverflow.com/questions/1930297/…
निकोला पेटकांस्की

1

यदि आप टैग को पूरी तरह से अलग नहीं करना चाहते हैं और सामग्री को टैग के अंदर रखना चाहते हैं, तो आप इस तरह से रूट नोड का उपयोग कर सकते हैं DOMDocumentऔर निकाल सकते हैं textContent:

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!

इस दृष्टिकोण का एक फायदा यह है कि इसके लिए किसी बाहरी पैकेज की आवश्यकता नहीं होती है।


1

Utf-8 में ग्रंथों के लिए, इसने मेरे लिए mb_convert_encoding का काम किया। त्रुटियों की परवाह किए बिना सब कुछ संसाधित करने के लिए, सुनिश्चित करें कि आप "@" का उपयोग करते हैं।

मेरे द्वारा उपयोग किया जाने वाला मूल कोड है:

$dom = new DOMDocument();
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));

$body = $dom->getElementsByTagName('body')->item(0);
echo $body->textContent;

यदि आप कुछ और अधिक उन्नत चाहते हैं, तो आप इसे नोड्स का विश्लेषण कर सकते हैं, लेकिन आप व्हाट्सएप के साथ कई समस्याओं का सामना करेंगे।

मैंने यहां जो कहा है, उसके आधार पर मैंने एक कन्वर्टर लागू किया है। यदि आप रुचि रखते हैं, तो आप इसे git https://github.com/kranemora/html2text से डाउनलोड कर सकते हैं

यह तुम्हारा बनाने के लिए एक संदर्भ के रूप में काम कर सकता है

आप इसे इस तरह से उपयोग कर सकते हैं:

$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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.