আমি রুবিতে কীভাবে এইচটিএমএল সত্তাকে এনকোড / ডিকোড করব?


200

আমি কিছু এইচটিএমএল সত্তা, যেমন '&amp;lt;'হয়ে ওঠার চেষ্টা করছি '<'

আমার একটি পুরাতন মণি রয়েছে ( html_helpers ) তবে এটি দু'বার পরিত্যাগ করা হয়েছে বলে মনে হয়।

কোন সুপারিশ? আমি এটি একটি মডেল ব্যবহার করা প্রয়োজন।


6
সবেমাত্র 'এইচটিএমলেটিটিস' ( htmlentities.rubyforge.org ) পাওয়া গেছে
কোস্টাস

আমার উল্লেখ করা উচিত যে আমি বিভিন্ন সাইটের একগুচ্ছ থেকে এইচটিএমএল পেয়েছি এবং এটি ডাটাবেসে সরল পাঠ্য হিসাবে সংরক্ষণ করা দরকার
Kostas

1
সর্বাধিক ভোট সিজিআই ব্যবহার করতে গিয়েছিল, এমনটি নয়। এটি একটি একক পদ্ধতি পেতে সমস্ত সক্রিয় সমর্থন টানার মতো। পরিবর্তে, নির্বাচিত উত্তরে উল্লিখিত হিসাবে, HTMLEntities ব্যবহার করুন।
টিন ম্যান

উত্তর:


153

এইচটিএমএলএনটিটিস এটি করতে পারে:

: 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!"

জেড্রাস্টি আইভাইলো। আপনার মন্তব্যের জন্য ধন্যবাদ; এটি আমার সমস্যার সমাধান করেছে যে আমি রুবিতে কীভাবে এক্সএমএল চরিত্র সত্তা রেফারেন্স দিতে পারি? যেমন!
জোশ গ্লোভার

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

অবশ্যই, এর আগে আপনাকে সিজিআই লাইব্রেরি অন্তর্ভুক্ত করতে হবে:

require 'cgi'

এবং যদি আপনি কারাগারে থাকেন তবে স্ট্রিংটিকে এনকোড করার জন্য আপনাকে সিজিআই ব্যবহার করার দরকার নেই। আছে hপদ্ধতি।

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

9
আমি প্রথমে এই পদ্ধতির চেষ্টা করেছি কিন্তু এটি "& nbsp;" এর মতো সত্ত্বাকে ঘুরিয়ে দেয় না; "" এ। আমার ধারণা, আমার উল্লেখ করা উচিত যে আমি বিভিন্ন সাইটগুলির একগুচ্ছ থেকে এইচটিএমএল পেয়েছি এবং এটি ডেটাবেসে সরল পাঠ্য হিসাবে সংরক্ষণ করতে হবে।
কোস্তাস

2
আপনি যদি কোনও ডাটাবেজে সাধারণ পাঠ্য হিসাবে স্টোরেজ করার জন্য এইচটিএমএল সত্তাকে ডিকোডিং করে থাকেন তবে আপনার ডেটাবেসটি খারাপ চরিত্রগুলি সম্পর্কে অনেক অভিযোগ করার প্রত্যাশা করে। সরল পাঠ্য হিসাবে স্থানান্তর করার জন্য এনকোডযুক্ত সংস্থাগুলি এনকোড করা হয়েছে। সেগুলি ডিকোডিং করতে পারে এবং সম্ভবত তাদেরকে উচ্চ-বিট-সেট অক্ষর, একে একে বাইনারিতে ফিরিয়ে দেয়। প্রায় সম্ভবত, আপনি মাল্টিবাইট চরিত্রগুলি দিয়ে শেষ করতে পারেন যা সত্যিই এমন কোনও ডিবিকে জ্বালাতন করবে যা সরল পাঠের প্রত্যাশা করে। কিছুই পরিবর্তন না হওয়া পর্যন্ত আপনি ডিকোডিংয়ের চেয়ে ভাল, একবারে এনকোড করুন যাতে সবকিছু স্বাভাবিক হয়ে যায়, তারপরে সেগুলি সংরক্ষণ করুন।
টিন ম্যান 21

1
আমি বেশ কয়েকটি এইচটিএমএলকে সত্ত্বার সাথে মুখোমুখি করেছি যা একাধিকবার এনকোড করা হয়েছে, সত্যই কিছু ঝামেলা তৈরি করে। পরীক্ষা করে দেখুন loofah ; এর স্ক্রবারগুলি এর জন্য ডিজাইন করা হয়েছিল যদি আমি সঠিক মনে করি।
টিন ম্যান 21

3
আমরা ইউনিকোড সংরক্ষণের জন্য আমাদের ডাটাবেস সেট করে রেখেছি তাই আমি সন্দেহ করি এটি একেবারেই অভিযোগ করবে। এবং লুফাহ আমি যা খুঁজছি তা নয়, আমি এইচটিএমএল ট্যাগগুলি থেকে মুক্তি পেতে চাই না - যাইহোক এই মুহুর্তে নয়।
কোস্তাস


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
@ টিটিনম্যান, হ্যাঁ আমি মনে করি এটি চাহিদার উপর নির্ভর করে। আপনি যেমন এই বিষয়টির আলোচনার মাধ্যমে দেখতে পাচ্ছেন, CGI.escapeHTMLসম্ভবত কিছু ক্ষেত্রে সমাধান করতে অক্ষম। অন্যদিকে, আপনার যদি একটি সম্পূর্ণ সেট সমর্থন প্রয়োজন, আমি নিশ্চিত Nokogiriযে ভাল পছন্দ।
হোয়াং লে

6
এছাড়াও আপনি যদি ইতিমধ্যে কিছু HTML পার্সিংয়ের জন্য নোকোগিরি ব্যবহার করে থাকেন তবে কেবলমাত্র সেই উদ্দেশ্যেই অন্য কোনও রত্ন ইনস্টল করা অযৌক্তিক। উদাহরণস্বরূপ, আমি এইচটিএমএল পরিষ্কার করার জন্য স্যানিটাইজ রত্ন ব্যবহার করছি। দেখা যাচ্ছে এই রত্নটি হুডির নিচে নোকোগিরি ব্যবহার করছে এবং তাই এর উদ্দীপনা না নেওয়ার জন্য এটি লজ্জার বিষয় হবে। টিপসটির জন্য @ হোয়াংলি ধন্যবাদ!
টমল্লা

1
দ্রষ্টব্য: CGI::escapeHTMLজার্মান চরিত্রগুলি äöüß এর মতো এড়াতে পারে না এবং আরও অনেক কিছু হতে পারে ... নোকোগিরি দিয়ে আমি এখনও পরীক্ষা করে দেখিনি, তবে এটি একটি প্লাস পয়েন্ট হবে।
বিউটি

এইচটিএমএলএনটিটিসগুলি একটি হালকা ওজনের এবং উপযুক্ত পছন্দ হবে। আমি নোকোগিরি প্রচুর ব্যবহার করি এবং যদি ইতিমধ্যে এটি লোড না করা হয় তবে আমি এইচটিএমএলএনটিটিস সহ যাব। সিজিআই এর মেয়াদ শেষ।
টিন ম্যান

36

রেলগুলিতে অক্ষরগুলি ডিকোড করতে ব্যবহার করুন:

<%= raw '<html>' %>

সুতরাং,

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

আউটপুট হবে

<br>

5
এটি যদিও কেবলমাত্র দৃষ্টিতে কাজ করে। আমার এমন কিছু দরকার যা অ্যাক্টিভেকর্ডেও কাজ করে।
কোস্তাস

3
সবেমাত্র ডিবাগারে পরীক্ষা করা হয়েছে - কাঁচা '& lt br & gt' ==> '& lt br & gt'।
উইল টমলিনস

13
#rawকিছুই ডিকোড না। এটি স্ট্রিংটিকে এনকোড না করার জন্য দর্শনটি বলে । এটি স্ট্রিংটি একটি তে মোড়ানো দ্বারা এটি করে ActiveSupport::SafeBuffer, যার পরিবর্তে একটি পতাকা থাকে ( html_safe?) সত্য হিসাবে সেট করা। দৃশ্যটি এই পতাকাটি এটি নির্ধারণ করতে ব্যবহার করে যে স্ট্রিংটি এড়িয়ে যাওয়া ছাড়া সরাসরি এইচটিএমএলতে ইনজেকশন দেওয়া যায়। আমি html_safeপ্রোগ্রামার দ্বারা একটি ইঙ্গিত হিসাবে ভাবতে চাই যে প্রশ্নে থাকা স্ট্রিং ইতিমধ্যে যথাযথভাবে পালিয়ে গেছে।
মক্সলে স্ট্রাটন

9

আপনি যদি কেবলমাত্র এটি করতে (যেমন HTMLEntities) করতে কোনও নতুন নির্ভরতা যুক্ত করতে না চান এবং আপনি ইতিমধ্যে ব্যবহার করছেন Hpricot, এটি আপনার পক্ষে পালিয়ে যেতে এবং আনস্কেপ উভয়ই করতে পারে। এটি এর থেকে অনেক বেশি পরিচালনা করে CGI:

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

5
এটি এখন দেখার জন্য লোকদের জন্য নোট - Hpricot আর রক্ষণাবেক্ষণ করা হয় না।
স্যামস্টেফেন্স

2
নোকোগিরি ব্যবহার করুন , যা এইচপিআরকোটের পরিবর্তে এক্সএমএল / এইচটিএমএল পার্সিংয়ের জন্য ডিফাক্টো মান।
টিন ম্যান

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 যুক্ত করে, আপনি এই দৃশ্যে বলছেন যে এটি নিরাপদ না হলে এটি নিরাপদ। এটি যখন আপনার ব্যবহারকারীরা সেই দৃশ্যটি লোড করবেন তখন এটি ঝুঁকিতে পড়বে।
ব্যবহারকারী 1515295

আমি জানি না কেন এত নেতিবাচক। আমি এই প্রশ্নের সমস্ত সমাধান চেষ্টা করেছিলাম। শুধুমাত্র এটি সূক্ষ্ম কাজ করে। এইচটিএমএল নিরাপদ সম্পর্কে, ব্যবহারকারী এইচটিএমএল রেন্ডার করতে চায়, তারপরে এইচটিএমএলওয়েজই সঠিক।
দিয়েগো সোমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.