এসকিউএল সার্ভারে স্ট্রিং থেকে এইচটিএমএল ট্যাগ ফালা ফেলার সেরা উপায়?


112

আমি এসকিউএল সার্ভার ২০০৫-তে এমন ডেটা পেয়েছি যাতে এইচটিএমএল ট্যাগ রয়েছে এবং আমি ট্যাগগুলির মধ্যে কেবল পাঠ্য রেখেই সেগুলি সরিয়ে ফেলতে চাই। মূলত এছাড়াও ভালো জিনিস প্রতিস্থাপন &lt;সঙ্গে <, ইত্যাদি

এটি করার কোনও সহজ উপায় আছে বা ইতিমধ্যে কেউ নমুনা টি-স্কেল কোড পেয়েছে?

আমার কাছে বর্ধিত সঞ্চিত প্রকল্পগুলি এবং পছন্দগুলি যুক্ত করার ক্ষমতা নেই, তাই খাঁটি টি-এসকিউএল পদ্ধতির পছন্দ করতে চান (সিক্যুয়ালি 2000 এর সাথে সামঞ্জস্যপূর্ণ এক পিছনের দিকে)।

আমি কেবল এইচটিএমএল থেকে স্ট্রিপ আউট নিয়ে তথ্য পুনরুদ্ধার করতে চাই, এটি আপডেট করব না, তাই সহজেই পুনরায় ব্যবহারের জন্য এটি আদর্শভাবে কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন হিসাবে লেখা হবে।

সুতরাং উদাহরণস্বরূপ এটি রূপান্তর:

<B>Some useful text</B>&nbsp;
<A onclick="return openInfo(this)"
   href="http://there.com/3ce984e88d0531bac5349"
   target=globalhelp>
   <IMG title="Source Description" height=15 alt="Source Description" 
        src="/ri/new_info.gif" width=15 align=top border=0>
</A>&gt;&nbsp;<b>more text</b></TD></TR>

এটি:

Some useful text > more text

উত্তর:


162

এখানে একটি ইউডিএফ রয়েছে যা এটি বর্ণিত হবে:

ব্যবহারকারী স্ট্রিপ এইচটিএমএল ফাংশন সংজ্ঞায়িত

CREATE FUNCTION [dbo].[udf_StripHTML] (@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX) AS
BEGIN
    DECLARE @Start INT
    DECLARE @End INT
    DECLARE @Length INT
    SET @Start = CHARINDEX('<',@HTMLText)
    SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
    SET @Length = (@End - @Start) + 1
    WHILE @Start > 0 AND @End > 0 AND @Length > 0
    BEGIN
        SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
        SET @Start = CHARINDEX('<',@HTMLText)
        SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
        SET @Length = (@End - @Start) + 1
    END
    RETURN LTRIM(RTRIM(@HTMLText))
END
GO

সম্পাদনা করুন: নোট করুন এটি এসকিউএল সার্ভার ২০০৫ এর জন্য, তবে আপনি যদি MAX কীওয়ার্ডটি ৪০০০ এর মতো কিছুতে পরিবর্তন করেন তবে এটি এসকিউএল সার্ভার ২০০০-এও কাজ করবে।


9
দুর্দান্ত, ধন্যবাদ মন্তব্যগুলি উন্নত সংস্করণে লিঙ্ক করেছে: lazycoders.blogspot.com/2007/06/… যা আরও এইচটিএমএল সত্তা নিয়ে কাজ করে।
ররি

4
নোট করুন যে এসকিউএল সার্ভার ২০০৫ বা তার পরে স্ট্রিং-ইনটেনসিভ ইউডিএফ হিসাবে, এটি একটি বিশাল পারফরম্যান্স বৃদ্ধির জন্য সিএলআর ইউডিএফ ফাংশন বাস্তবায়নের জন্য উপযুক্ত প্রার্থী । : তাই এখানে করছেন আরো তথ্য stackoverflow.com/questions/34509/...
RedFilter

10
লক্ষ করুন অলস কোডার পোস্টে দুটি টাইপ রয়েছে। CHAR(13) + CHAR(10)যে দুটি বিভাগ রয়েছে সেগুলির দুটিতে প্রায় একক কোটগুলি সরান । সূক্ষ্ম পর্যাপ্ত আমি এটি ধরতে পারি না যতক্ষণ না এটি একটি ছোট ক্ষেত্রের দৈর্ঘ্য অতিক্রম করে (আকর্ষণীয়ভাবে এবং আমার জন্য প্রয়োজনীয়, সমস্ত প্রতিস্থাপন মূল স্ট্রিংয়ের চেয়ে ছোট)।
গুদেডে

1
এইচটিএমএল এনকোড হওয়া মানগুলি সম্পর্কে কী? তাদের ডিকোড করা দরকার। ধন্যবাদ।
জেডিপিচাম

2
আমি অলসকোডারগুলি ব্যবহার করেছি, এবং উপরের @ লুগডে থেকে টাইপো ফিক্স - দুর্দান্ত কাজ করে। সময় সাশ্রয়ের জন্য, অলসকোডারগুলি ব্লগ সংস্করণটি এখানে রয়েছে: lazycoders.blogspot.com/2007/06/…
qxotk

18

@ গোনার ডগ উত্তর থেকে প্রাপ্ত, কয়েকটি জিনিস আপডেট করা সহ:
- যেখানে সম্ভব REPLACE ব্যবহার করে
- পূর্বনির্ধারিত সত্তাগুলির রূপান্তর &eacute;( যেমনটি আমি পছন্দ করেছিলাম সেগুলি বেছে নিয়েছিল :-)
- তালিকা ট্যাগগুলির কিছু রূপান্তর<ul> and <li>

ALTER FUNCTION [dbo].[udf_StripHTML]
--by Patrick Honorez --- www.idevlop.com
--inspired by http://stackoverflow.com/questions/457701/best-way-to-strip-html-tags-from-a-string-in-sql-server/39253602#39253602
(
@HTMLText varchar(MAX)
)
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @Start  int
DECLARE @End    int
DECLARE @Length int

set @HTMLText = replace(@htmlText, '<br>',CHAR(13) + CHAR(10))
set @HTMLText = replace(@htmlText, '<br/>',CHAR(13) + CHAR(10))
set @HTMLText = replace(@htmlText, '<br />',CHAR(13) + CHAR(10))
set @HTMLText = replace(@htmlText, '<li>','- ')
set @HTMLText = replace(@htmlText, '</li>',CHAR(13) + CHAR(10))

set @HTMLText = replace(@htmlText, '&rsquo;' collate Latin1_General_CS_AS, ''''  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&quot;' collate Latin1_General_CS_AS, '"'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&amp;' collate Latin1_General_CS_AS, '&'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&euro;' collate Latin1_General_CS_AS, '€'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&lt;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&gt;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&oelig;' collate Latin1_General_CS_AS, 'oe'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&nbsp;' collate Latin1_General_CS_AS, ' '  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&copy;' collate Latin1_General_CS_AS, '©'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&laquo;' collate Latin1_General_CS_AS, '«'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&reg;' collate Latin1_General_CS_AS, '®'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&plusmn;' collate Latin1_General_CS_AS, '±'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&sup2;' collate Latin1_General_CS_AS, '²'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&sup3;' collate Latin1_General_CS_AS, '³'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&micro;' collate Latin1_General_CS_AS, 'µ'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&middot;' collate Latin1_General_CS_AS, '·'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ordm;' collate Latin1_General_CS_AS, 'º'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&raquo;' collate Latin1_General_CS_AS, '»'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&frac14;' collate Latin1_General_CS_AS, '¼'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&frac12;' collate Latin1_General_CS_AS, '½'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&frac34;' collate Latin1_General_CS_AS, '¾'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Aelig' collate Latin1_General_CS_AS, 'Æ'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Ccedil;' collate Latin1_General_CS_AS, 'Ç'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Egrave;' collate Latin1_General_CS_AS, 'È'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Eacute;' collate Latin1_General_CS_AS, 'É'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Ecirc;' collate Latin1_General_CS_AS, 'Ê'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Ouml;' collate Latin1_General_CS_AS, 'Ö'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&agrave;' collate Latin1_General_CS_AS, 'à'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&acirc;' collate Latin1_General_CS_AS, 'â'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&auml;' collate Latin1_General_CS_AS, 'ä'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&aelig;' collate Latin1_General_CS_AS, 'æ'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ccedil;' collate Latin1_General_CS_AS, 'ç'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&egrave;' collate Latin1_General_CS_AS, 'è'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&eacute;' collate Latin1_General_CS_AS, 'é'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ecirc;' collate Latin1_General_CS_AS, 'ê'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&euml;' collate Latin1_General_CS_AS, 'ë'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&icirc;' collate Latin1_General_CS_AS, 'î'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ocirc;' collate Latin1_General_CS_AS, 'ô'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ouml;' collate Latin1_General_CS_AS, 'ö'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&divide;' collate Latin1_General_CS_AS, '÷'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&oslash;' collate Latin1_General_CS_AS, 'ø'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ugrave;' collate Latin1_General_CS_AS, 'ù'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&uacute;' collate Latin1_General_CS_AS, 'ú'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ucirc;' collate Latin1_General_CS_AS, 'û'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&uuml;' collate Latin1_General_CS_AS, 'ü'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&quot;' collate Latin1_General_CS_AS, '"'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&amp;' collate Latin1_General_CS_AS, '&'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&lsaquo;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&rsaquo;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)


-- Remove anything between <STYLE> tags
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('<', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('</STYLE>', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1
END

-- Remove anything between <whatever> tags
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1
END

RETURN LTRIM(RTRIM(@HTMLText))

END

4
আমি এটি ব্যবহার করেছি এবং এটি পছন্দ করেছি, তবে শীর্ষ গ্রুপে আমি আরও একটি প্রতিস্থাপন যুক্ত করেছি: </ p> অনুচ্ছেদে ট্যাগটি শেষ হওয়ার পরে সাধারণত একটি নতুন রেখা নির্দেশিত হওয়ায় আমি আরও একটি চর + 13 + চর 10 এ পরিবর্তন করেছি। এটি আমার নির্দিষ্ট
ডিআর

1
এই উত্তরটি বেশিরভাগ অংশের জন্য দুর্দান্ত কাজ করেছে, তবে এমন একটি ধারণা রয়েছে যে আপনার সমস্ত HTML ট্যাগ বৈধ are আমার ক্ষেত্রে, ভিআরচআরএআর আপলোডে একটি কাটা সমস্যা ছিল যা কিছু ক্লোজিং ট্যাগকে মুছে ফেলে। একটি সরল PATINDEX আর্ট্রিম সমস্ত কিছু মুছে ফেলার কৌশলটি করেছিল।
matt123788

2
পরিবর্তন @DR তৈরি (প্লাস আরো কয়েকটি যে প্রয়োজনীয় ঘোড়ার গাড়ি আয়) ছাড়াও, আমিও প্রতিস্থাপিত যে ফলাফলের সরানো <এবং >খুব শেষ। অন্যথায় তারা ট্যাগ সহ সরানো হয়েছে।
এ_হরদিন

8

যদি আপনার এইচটিএমএলটি ভালভাবে গঠিত হয় তবে আমি মনে করি এটি একটি আরও ভাল সমাধান:

create function dbo.StripHTML( @text varchar(max) ) returns varchar(max) as
begin
    declare @textXML xml
    declare @result varchar(max)
    set @textXML = REPLACE( @text, '&', '' );
    with doc(contents) as
    (
        select chunks.chunk.query('.') from @textXML.nodes('/') as chunks(chunk)
    )
    select @result = contents.value('.', 'varchar(max)') from doc
    return @result
end
go

select dbo.StripHTML('This <i>is</i> an <b>html</b> test')

1
এটি আমার পক্ষে কাজ করেছে। +1 টি। তবে আপনি কি দয়া করে আপনার কোডটি ব্যাখ্যা করতে পারেন, যাতে বিকাশকারীরা এটি আরও সহজে বুঝতে পারে? :)
সা Saeedদ নেমতি

দেখে মনে হচ্ছে এটি এইচটিএমএলকে একটি এক্সএমএল ডকুমেন্ট হিসাবে লোড করে তার থেকে সমস্ত মান নির্বাচন করে। দ্রষ্টব্য: এই কোডটি & nbsp;
জেডিপিচাম

2
এইচটিএমএল কোডগুলিতে বোমা না দেওয়ার জন্য একটি হ্যাক রাখুন। স্পষ্টতই ঘরে বসে ব্যবহার বা যা কিছু (কেবল গ্রহণযোগ্য ইউডিএফ সহ) কেবলমাত্র একটি দ্রুত হ্যাক।
dudeNumber4

এটি ভালভাবে গঠন করতে হবে, তাই এটি রেডফিল্টারের মতো ত্রুটি সহিষ্ণু নয়।
মিকা বি।

1
এইচটিএমএল এক্সএমএলের একটি উপসেট নয়। এক্সএইচটিএমএল, তবে এইচটিএমএল আর সেই রাস্তায় নামবে না not
ডেভিড

7

এই ফাংশনের একটি আপডেট সংস্করণ এখানে রেডফিল্টার উত্তর (পিনালের মূল) লাজি কোডার্স সংযোজন এবং গুডে টাইপো সংশোধন এবং <STYLE>এইচটিএমএলের অভ্যন্তরে লাইন ট্যাগগুলি হ্যান্ডেল করার জন্য আমার নিজস্ব সংযোজনকে অন্তর্ভুক্ত করে।

ALTER FUNCTION [dbo].[udf_StripHTML]
(
@HTMLText varchar(MAX)
)
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @Start  int
DECLARE @End    int
DECLARE @Length int

-- Replace the HTML entity &amp; with the '&' character (this needs to be done first, as
-- '&' might be double encoded as '&amp;amp;')
SET @Start = CHARINDEX('&amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
SET @Start = CHARINDEX('&amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &lt; with the '<' character
SET @Start = CHARINDEX('&lt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '<')
SET @Start = CHARINDEX('&lt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &gt; with the '>' character
SET @Start = CHARINDEX('&gt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '>')
SET @Start = CHARINDEX('&gt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &amp; with the '&' character
SET @Start = CHARINDEX('&amp;amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
SET @Start = CHARINDEX('&amp;amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &nbsp; with the ' ' character
SET @Start = CHARINDEX('&nbsp;', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, ' ')
SET @Start = CHARINDEX('&nbsp;', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1
END

-- Replace any <br> tags with a newline
SET @Start = CHARINDEX('<br>', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
SET @Start = CHARINDEX('<br>', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1
END

-- Replace any <br/> tags with a newline
SET @Start = CHARINDEX('<br/>', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
SET @Start = CHARINDEX('<br/>', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1
END

-- Replace any <br /> tags with a newline
SET @Start = CHARINDEX('<br />', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
SET @Start = CHARINDEX('<br />', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1
END

-- Remove anything between <STYLE> tags
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('<', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('</STYLE>', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1
END

-- Remove anything between <whatever> tags
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1
END

RETURN LTRIM(RTRIM(@HTMLText))

END

1
আমার তথ্যের জন্য, এর STUFF()পরিবর্তে কোনও কারণ ব্যবহার করা হচ্ছে REPLACE()(কোনটি ওয়াশড আইএমও কম হবে)?
প্যাট্রিক হনোরেজ

আমি সত্যিই এটি সম্পর্কে চিন্তা করা হয়নি। আমি যেমনটি ইঙ্গিত করেছি তেমনই মূল অনুলিপি / সংশোধন করেছি। প্রতিস্থাপন খুব ভাল একটি ভাল বিকল্প হতে পারে। আমি ভাবতে ভাবতে দুটি ফাংশনের মধ্যে পারফরম্যান্স তুলনা আছে কিনা ...
গোনার ডগ

1
@ গোনারডগ এই জন্য উত্সাহিত, গ্রহণযোগ্য মন্তব্যগুলি পড়ার মতো ছিল, এটি সত্যই আপডেট করার প্রয়োজন।
জোনো

4

এটি সম্পূর্ণ নতুন সমাধান নয় তবে আফসোস সার্ভারের সমাধানের সংশোধন :

--note comments to see the corrections

CREATE FUNCTION [dbo].[StripHTML] (@HTMLText VARCHAR(MAX))  
RETURNS VARCHAR(MAX)  
AS  
BEGIN  
 DECLARE @Start  INT  
 DECLARE @End    INT  
 DECLARE @Length INT  
 --DECLARE @TempStr varchar(255) (this is not used)  

 SET @Start = CHARINDEX('<',@HTMLText)  
 SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))  
 SET @Length = (@End - @Start) + 1  

 WHILE @Start > 0 AND @End > 0 AND @Length > 0  
 BEGIN  
   IF (UPPER(SUBSTRING(@HTMLText, @Start, 4)) <> '<BR>') AND (UPPER(SUBSTRING(@HTMLText, @Start, 5)) <> '</BR>')  
    begin  
      SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')  
      end  
-- this ELSE and SET is important
   ELSE  
      SET @Length = 0;  

-- minus @Length here below is important
   SET @Start = CHARINDEX('<',@HTMLText, @End-@Length)  
   SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText, @Start))  
-- instead of -1 it should be +1
   SET @Length = (@End - @Start) + 1  
 END  

 RETURN RTRIM(LTRIM(@HTMLText))  
END  

আমি বর্ণের পরিবর্তে এনভারচর ব্যবহার করার পরে এটি আমার পক্ষে কাজ করেছে কারণ আমি এইচটিএমএল ট্যাগগুলির মধ্যে ইউনিকোড অক্ষর ব্যবহার করি
শাদি নমরোতি

3

এটা চেষ্টা কর. এটি রেডফিল্টার পোস্ট করা একটির পরিবর্তিত সংস্করণ ... এই এসকিউএলটি বিআর, বি, এবং পি ব্যতীত অন্য কোনও বৈশিষ্ট্যযুক্ত সমস্ত ট্যাগ মুছে ফেলে:

CREATE FUNCTION [dbo].[StripHtml] (@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
 DECLARE @Start  INT
 DECLARE @End    INT
 DECLARE @Length INT
 DECLARE @TempStr varchar(255)

 SET @Start = CHARINDEX('<',@HTMLText)
 SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
 SET @Length = (@End - @Start) + 1

 WHILE @Start > 0 AND @End > 0 AND @Length > 0
 BEGIN
   IF (UPPER(SUBSTRING(@HTMLText, @Start, 3)) <> '<BR') AND (UPPER(SUBSTRING(@HTMLText, @Start, 2)) <> '<P') AND (UPPER(SUBSTRING(@HTMLText, @Start, 2)) <> '<B') AND (UPPER(SUBSTRING(@HTMLText, @Start, 3)) <> '</B')
   BEGIN
      SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
   END

   SET @Start = CHARINDEX('<',@HTMLText, @End)
   SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText, @Start))
   SET @Length = (@End - @Start) - 1
 END

 RETURN RTRIM(LTRIM(@HTMLText))
END

আমার জন্য কাজ করেন নি SELECT dbo.StripHtml ('<b> কিছু কিছু </ b>'); সেই সঠিক স্ট্রিংটি ফিরিয়ে দেয়
লাডিয়ু

@ এলডিউ, এটি প্রত্যাশিত উত্তরের প্রথম লাইনটি পরীক্ষা করুন ("এই এসকিউএল বিআর, বি, এবং পি ব্যতীত অন্য কোনও বৈশিষ্ট্য সহ সমস্ত ট্যাগ মুছে ফেলে")।
পিটার হারডেনবার্গ

এই এসকিউএল ফাংশনটি ভুল। সংশোধন ফাংশন জন্য দয়া করে নীচের উত্তর দেখুন।
ভবিষ্যতলাইট 7

@ ভবিষ্যতলাইট 7 কোনও নীচে "ও" উপরে "নীচে" এবং এসও পৃষ্ঠায় উত্তরগুলি কোথায় পাবেন সে বিষয়ে একটি রেফারেন্স হিসাবে ব্যবহার করা বোকামি, কারণ উত্তরের ক্রমটি শীর্ষে থাকা ট্যাবগুলি ব্যবহার করে পরিবর্তন করা যেতে পারে (এবং আরও, ভোটের উত্তর ক্রম পরিবর্তন করতে পারে)। দয়া করে কোনও পোস্ট লেখকের নাম ব্যবহার করে একটি উত্তর নির্দিষ্ট করুন
Caius Jard

3

ওয়ান লাইনারের সাথে এক্সকিউরি ব্যবহার সম্পর্কে কীভাবে:

DECLARE @MalformedXML xml, @StrippedText varchar(max)
SET @MalformedXML = @xml.query('for $x in //. return ($x)//text()')
SET @StrippedText = CAST(@MalformedXML as varchar(max))

এটি সমস্ত উপাদানগুলির মধ্য দিয়ে যায় এবং কেবলমাত্র () পাঠ্য দেয়।

ফাঁকা ছাড়াই উপাদানগুলির মধ্যে পাঠ্য এড়ানোর জন্য, ব্যবহার করুন:

DECLARE @MalformedXML xml, @StrippedText varchar(max)
SET @MalformedXML = @xml.query('for $x in //. return concat((($x)//text())[1]," ")')
SET @StrippedText = CAST(@MalformedXML as varchar(max))

এবং "আপনি কীভাবে এটি কোনও কলামের জন্য ব্যবহার করবেন:" এর প্রতিক্রিয়া জানাতে

  SELECT CAST(html_column.query('for $x in //. return concat((($x)//text()) as varchar(max))
  FROM table

উপরের কোডের জন্য, আপনার html_columnতথ্য প্রকারের তা নিশ্চিত করুন xml, যদি না হয় তবে আপনাকে এইচটিএমএল হিসাবে একটি কাস্টেড সংস্করণ সংরক্ষণ করতে হবে xml। আপনি এইচটিএমএল ডেটা লোড করার সময় আমি এটি একটি পৃথক অনুশীলন হিসাবে করব, কারণ এসকিউএল একটি ত্রুটি নিক্ষেপ করবে যদি এটি ত্রুটিযুক্ত এক্সএমএল খুঁজে পাওয়া যায়, যেমন: মিল না পাওয়া শুরু / শেষ ট্যাগ, অবৈধ অক্ষর।

আপনি যখন সিচ বাক্যাংশ, স্ট্রিপ এইচটিএমএল ইত্যাদি তৈরি করতে চান তখন এগুলি দুর্দান্ত for

কেবলমাত্র নোট করুন যে এই প্রকারটি এক্সএমএল টাইপ করে, তাই উপযুক্ত যেখানে পাঠাতে কাস্ট বা গোপন করুন। এই ডেটা টাইপের এক্সএমএল সংস্করণ অকেজো, কারণ এটি কোনও সুগঠিত এক্সএমএল নয়।


এক্সএমএল থেকে কাস্ট করার আসল সমাধান ছাড়াই আমার কাছে মনে হয় এটি সর্বোত্তম একটি আংশিক সমাধান।
ডেনিস জাহেরউদ্দিন 6'18

CAST (@xML বার্চর হিসাবে (সর্বোচ্চ))। বা কনভার্ট (এক্সএমএল), @ এক্সএমএল)। ধরে নেওয়া হয়েছে বেশিরভাগ বিকাশকারী এটি বের করে আনবেন।
অরভিন আমির

1
এটি অবশ্যই অনুমানযোগ্যভাবে যুক্তিযুক্ত যে বিকাশকারীরা কীভাবে কাস্ট করতে হয় তা জানেন তবে মনে রাখবেন যে আপনার উত্তর পড়া কেউ সরাসরি দেখতে পাবে না যে 'সরল' castালাই করা দরকার is বিশেষত কারণ এটি উল্লেখ করা হয়েছে যে আমরা নিক্ষেপ করতে পারি উপযুক্ত যেখানে । - আমি নেতিবাচক হওয়ার চেষ্টা করছি না, কেবল আশা করি এটি আপনাকে উত্তর হিসাবে কার্যকর হিসাবে স্বীকৃতি দেওয়া আরও সহজ যে উত্তরগুলি তৈরি করতে সহায়তা করবে!
ডেনিস জাহেরউদ্দিন

তাহলে কলামের নামটি এর কোন অংশ? বলুন আমার কাছে একটি টেবিল আছেdata কলাম কল করা কল রয়েছে htmlএবং আমি এই কলামটিতে সমস্ত মান নির্বাচন করতে চাই তবে এইচটিএমএল ট্যাগগুলি স্ট্রিপ করব কীভাবে আমি আপনার উত্তরটি এটি অর্জন করতে পারি?
ফেলিক্স ইভ

2

এখানে এমন একটি সংস্করণ যা একটি ইউডিএফের প্রয়োজন হয় না এবং এটি এইচটিএমএলে ক্লোজিং ট্যাগগুলির সাথে মিল না দিয়ে ট্যাগ থাকা সত্ত্বেও কাজ করে।

TRY_CAST(REPLACE(REPLACE(REPLACE([HtmlCol], '>', '/> '), '</', '<'), '--/>', '-->') AS XML).value('.', 'NVARCHAR(MAX)')

1

অরভিন আমিরের উত্তর সম্পূর্ণ এক-লাইন সমাধানের নিকটে এসে আপনি যে কোনও জায়গায় ফেলে যেতে পারেন; তিনি তার নির্বাচিত বিবৃতিতে একটি সামান্য বাগ পেয়েছেন (লাইনের শেষটি অনুপস্থিত), এবং আমি খুব সাধারণ চরিত্রের রেফারেন্সগুলি পরিচালনা করতে চেয়েছিলাম wanted

আমি যা করে শেষ করেছি তা হ'ল:

SELECT replace(replace(replace(CAST(CAST(replace([columnNameHere], '&', '&amp;') as xml).query('for $x in //. return concat((($x)//text())[1]," ")') as varchar(max)), '&amp;', '&'), '&nbsp;', ' '), '&#x20;', ' ')
FROM [tableName]

চরিত্রের রেফারেন্স কোড ব্যতীত এটিকে সহজ করা যায়:

SELECT CAST(CAST([columnNameHere] as xml).query('for $x in //. return concat((($x)//text())[1]," ")') as varchar(max))
FROM [tableName]

0

প্যাট্রিক হোনোরেজ কোডের কিছুটা পরিবর্তন দরকার।

এটি রয়েছে এমন এইচটিএমএল এর জন্য অসম্পূর্ণ ফলাফল প্রদান করে &lt; বা&gt;

কারণ বিভাগের নীচে কোড

- ট্যাগের মধ্যে কিছু মুছে ফেলুন

আসলে <> কিছুইতে প্রতিস্থাপন করবে। সমাধানটি নীচে নীচের দুটি লাইন প্রয়োগ করতে হবে:

set @HTMLText = replace(@htmlText, '&lt;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&gt;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.