मैं रूबी में HTML संस्थाओं को कैसे एन्कोड / डिकोड कर सकता हूं?


200

मैं कुछ HTML संस्थाओं को डीकोड करने की कोशिश कर रहा हूं, जैसे कि '&amp;lt;'बनना '<'

मेरे पास एक पुराना रत्न है ( html_helpers ) लेकिन ऐसा लगता है कि दो बार छोड़ दिया गया है।

कोई सिफारिशें? मुझे इसे एक मॉडल में उपयोग करने की आवश्यकता होगी।


6
बस 'htmlentities' ( htmlentities.rubyforge.org ) पाया गया
कोस्टा

मुझे यह निर्दिष्ट करना चाहिए कि मुझे विभिन्न साइटों के एक समूह से html प्राप्त करना है और इसे डेटाबेस में सादे पाठ के रूप में सहेजने की आवश्यकता है
Kostas

1
जबकि अधिकांश वोट CGI का उपयोग करने के लिए गए, नहीं। यह एक विधि प्राप्त करने के लिए सभी सक्रिय समर्थन में खींचने की तरह है। इसके बजाय, चयनित उत्तर में उल्लिखित HTMLEntities का उपयोग करें।
द टिन मैन

जवाबों:


153

HTMLEntities यह कर सकते हैं:

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"

Zdrasti Ivailo। आपके कमेंट के लिए धन्यवाद; इसने मेरी समस्या को हल कर दिया कि मैं रूबी में XML चरित्र इकाई संदर्भ कैसे प्रस्तुत कर सकता हूं? भी!
जोश ग्लोवर

4
युप, HTMLEntitiesमणि जैसे मामलों से संबंधित है &aring;और &mdash;जो CGI.unescapeHTMLनहीं करता है।
थोमैक्स डेस

295

वर्णों को एनकोड करने के लिए, आप उपयोग कर सकते हैं CGI.escapeHTML:

string = CGI.escapeHTML('test "escaping" <characters>')

उन्हें डिकोड करने के लिए, वहाँ है CGI.unescapeHTML:

CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")

बेशक, इससे पहले कि आप CGI पुस्तकालय को शामिल करने की जरूरत है:

require 'cgi'

और यदि आप रेल में हैं, तो आपको स्ट्रिंग को एनकोड करने के लिए CGI का उपयोग करने की आवश्यकता नहीं है। वहाँ hविधि है।

<%= h 'escaping <html>' %>

9
मैंने पहले इस दृष्टिकोण की कोशिश की लेकिन यह "& nbsp;" जैसी संस्थाओं को चालू नहीं करता है। "" में। मुझे लगता है कि मुझे यह निर्दिष्ट करना चाहिए कि मुझे विभिन्न साइटों के एक समूह से html मिलें और इसे डेटाबेस में सादे पाठ के रूप में सहेजने की आवश्यकता है।
कोस्तास

2
यदि आप डेटाबेस में सादे पाठ के रूप में भंडारण के लिए HTML संस्थाओं को डिकोड कर रहे हैं, तो अपने डेटाबेस से बुरे पात्रों के बारे में बहुत अधिक शिकायत करने की अपेक्षा करें। एन्कोडेड इकाइयां उन्हें सादे पाठ के रूप में स्थानांतरित करने की अनुमति देने के लिए एन्कोडेड हैं। डिकोडिंग उन्हें कर सकते हैं, और सबसे अधिक संभावना है, उन्हें ऊपरी-बिट-सेट वर्ण, AKA बाइनरी पर वापस लाएंगे। लगभग संभावना के रूप में, आप मल्टीबीट पात्रों के साथ समाप्त हो सकते हैं जो वास्तव में एक डीबी को परेशान करेंगे जो सादे पाठ की उम्मीद कर रहे हैं। आप कुछ भी नहीं बदलने तक डिकोडिंग से बेहतर हैं, तो सब कुछ सामान्य होने के बाद एक बार एनकोड करें, फिर उन्हें स्टोर करें।
टिन मैन

1
मैंने बहुत सी HTML संस्थाओं का सामना किया है जो कई बार एनकोड की गई हैं, वास्तव में चीजों को गड़बड़ कर रही हैं। बाहर की जाँच करें लूफै़ण ; अगर मुझे सही याद है तो इसके लिए इसके स्क्रब डिज़ाइन किए गए थे।
टिन मैन

3
हमने अपना डेटाबेस यूनिकोड को बचाने के लिए सेट किया है, इसलिए मुझे संदेह है कि यह बिल्कुल भी शिकायत करेगा। और लूफै़ण वह नहीं है जिसकी मुझे तलाश है, मैं html टैग से छुटकारा नहीं चाहता - वैसे भी इस बिंदु पर नहीं।
कोस्तास

1
यह 2015 है, unescapeHTML अभी भी कुछ संस्थाओं को छोड़ देता है जैसे कि एक तीव्र
nurettin

47

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

नमूने:

a = Nokogiri::HTML.parse "foo&nbsp;b&auml;r"    
a.text 
=> "foo bär"

या

a = Nokogiri::HTML.parse "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"

3
@theTinMan, हाँ, मुझे लगता है कि यह मांग पर निर्भर करता है। जैसा कि आप इस विषय में चर्चा के माध्यम से देख सकते हैं, CGI.escapeHTMLशायद कुछ मामलों को हल करने में असमर्थ हैं। दूसरी ओर, यदि आपको पूर्ण समर्थन की आवश्यकता है, तो मुझे यकीन है कि Nokogiriएक अच्छा विकल्प है।
होआंग ले

6
इसके अलावा अगर आप पहले से ही कुछ HTML पार्सिंग के लिए नोकोगिरी का उपयोग कर रहे हैं, तो यह केवल उस उद्देश्य के लिए एक और रत्न स्थापित करने के लिए अनुचित है। उदाहरण के लिए, मैं HTML की सफाई के लिए Sanitize रत्न का उपयोग कर रहा हूं। इस मणि को हुड के नीचे नोकगिरी का उपयोग किया जाता है और इसलिए इसका रोमांच नहीं लेना शर्म की बात होगी। धन्यवाद @HoangLe टिप के लिए!
तोमला

1
नोट: CGI::escapeHTMLजर्मन पात्रों जैसे äöß doesn't, और शायद अधिक से बच नहीं है ... Nokogiri के साथ मैंने अभी तक जाँच नहीं की है, लेकिन यह एक प्लस बिंदु होगा।
सौंदर्य

HTMLEntities एक हल्का और सक्षम विकल्प होगा। मैं नोकोगिरी का बहुत उपयोग करता हूं, और, जब तक कि मेरे पास पहले से ही लोड नहीं है, मैं HTMLEntities के साथ जाऊंगा। CGI पुराना हो चुका है।
द टिन मैन

36

रेल के उपयोग में पात्रों को डिकोड करने के लिए:

<%= raw '<html>' %>

इसलिए,

<%= raw '&lt;br&gt;' %>

उत्पादन होगा

<br>

5
यह केवल देखने में काम करता है। मुझे ऐसा कुछ चाहिए जो ActiveRecord में भी काम करे।
कोस्टास

3
बस डिबगर में परीक्षण किया गया - कच्चा '& lt br & gt' ==> '& lt br & gt'।
विल टॉमलिन्स

13
#rawकुछ भी डिकोड नहीं करता है। यह स्ट्रिंग को एनकोड करने का दृश्य नहीं बताता है । यह स्ट्रिंग को एक में लपेटकर ऐसा करता है ActiveSupport::SafeBuffer, जिसमें बदले में एक झंडा होता है ( html_safe?), सही पर सेट। दृश्य इस ध्वज का उपयोग यह निर्धारित करने के लिए करता है कि स्ट्रिंग को बिना HTML में सीधे इंजेक्ट किया जा सकता है बिना बच जाए। मैं html_safeप्रोग्रामर द्वारा एक संकेत के रूप में सोचना पसंद करता हूं कि प्रश्न में स्ट्रिंग पहले से ही ठीक से बच गई है।
मोक्सले स्ट्रैटन

9

यदि आप ऐसा करने के लिए सिर्फ एक नई निर्भरता नहीं जोड़ना चाहते हैं (जैसे HTMLEntities) और आप पहले से ही उपयोग कर रहे हैं Hpricot, तो यह आपके लिए बच और अनस्केप कर सकता है। यह बहुत अधिक से अधिक संभालती है CGI:

Hpricot.uxs "foo&nbsp;b&auml;r"
=> "foo bär"

5
अब इसे देखने वाले लोगों के लिए ध्यान दें - हरिकोट का रखरखाव अब नहीं किया जाता है।
सैमस्टफेन्स

2
नोकोगिरी का प्रयोग करें , जो कि Hpricot के बजाय XML / HTML पार्सिंग के लिए डिफ़ैक्टो मानक है।
टिन मैन

0

आप htmlasciiमणि का उपयोग कर सकते हैं :

Htmlascii.convert string

-5
<% str="<h1> Test </h1>" %>

result: &lt; h1 &gt; Test &lt; /h1 &gt;

<%= CGI.unescapeHTML(str).html_safe %>

मुझे लगता है कि किसी भी उपयोगकर्ता-प्रविष्ट पाठ पर html_safe को जोड़कर, आप यह बता रहे हैं कि यह सुरक्षित है जब यह संभव है कि यह सुरक्षित नहीं है। जब वे उस दृश्य को लोड करते हैं तो यह आपके उपयोगकर्ताओं को जोखिम में डाल देगा।
user1515295

मैं नहीं जानता कि इतना नकारात्मक क्यों है। मैंने इस प्रश्न में सभी समाधानों की कोशिश की। केवल यह ठीक काम करता है। HTML सुरक्षित के बारे में, उपयोगकर्ता HTML रेंडर करने के लिए चाहता है, तो HTML_SAFE सही है।
डिएगो सोमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.