2010-06-21 14 views
6

यह देखने के लिए त्वरित जांच करें कि किसी को दिए गए nvarchar इनपुट से स्लग उत्पन्न करने में सक्षम टी-एसक्यूएल फ़ंक्शन के पास या जानता है या नहीं। अर्थात;स्लग उत्पन्न करने के लिए टी-एसक्यूएल फ़ंक्शन?

"नमस्ते दुनिया"> "हैलो दुनिया"
"यह एक परीक्षण है"> "यह है एक परीक्षण"

मैं एक सी # समारोह है कि मैं सामान्य रूप से के लिए उपयोग किया है इन उद्देश्यों, लेकिन इस मामले में मेरे पास पार्स और स्लग्स में बदलने के लिए बड़ी मात्रा में डेटा है, इसलिए यह तार पर डेटा स्थानांतरित करने के बजाय SQL सर्वर पर ऐसा करने के लिए अधिक समझ में आता है।

एक के रूप में अलग रूप में, मैं बॉक्स के लिए दूरस्थ डेस्कटॉप का उपयोग कर सकते तो मैं कोड नहीं चल सकती (.net, Powershell आदि) इसके खिलाफ

अग्रिम धन्यवाद नहीं है।

संपादित करें:

public static string GenerateSlug(string n, int maxLength) 
{ 
    string s = n.ToLower();     
    s = Regex.Replace(s, @"[^a-z0-9s-]", "");    
    s = Regex.Replace(s, @"[s-]+", " ").Trim();    
    s = s.Substring(0, s.Length <= maxLength ? s.Length : maxLength).Trim();    
    s = Regex.Replace(s, @"s", "-"); 
    return s; 
} 
+0

आप अपने सी # slug- पोस्ट कर सकते हैं जनरेटर समारोह? – Constantin

उत्तर

8

यह वही है मैं एक समाधान के रूप में ले कर आए हैं है। जहां आवश्यक हो वहां ठीक/संशोधित करने के लिए स्वतंत्र महसूस करें।

मुझे यह उल्लेख करना चाहिए कि जिस डेटाबेस में मैं वर्तमान में विकास कर रहा हूं वह मामला असंवेदनशील है इसलिए लोअर (@str)।

CREATE FUNCTION [dbo].[UDF_GenerateSlug] 
( 
    @str VARCHAR(100) 
) 
RETURNS VARCHAR(100) 
AS 
BEGIN 
DECLARE @IncorrectCharLoc SMALLINT 
SET @str = LOWER(@str) 
SET @IncorrectCharLoc = PATINDEX('%[^0-9a-z ]%',@str) 
WHILE @IncorrectCharLoc > 0 
BEGIN 
SET @str = STUFF(@str,@incorrectCharLoc,1,'') 
SET @IncorrectCharLoc = PATINDEX('%[^0-9a-z ]%',@str) 
END 
SET @str = REPLACE(@str,' ','-') 
RETURN @str 
END 

मूल कोड के लिए http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/ पर ध्यान दें।

+1

यह नहीं होना चाहिए ' '% [^ 0-9a-z]%'' 'लेकिन होना चाहिए '% [^ 0-9a-z-]%'' –

9

आप LOWER उपयोग कर सकते हैं और REPLACE यह करने के लिए: के थोक अद्यतन के लिए

SELECT REPLACE(LOWER(origString), ' ', '-') 
FROM myTable 

अनुरोध के अनुसार, यहां समारोह मैं आम तौर पर मल उत्पन्न करने के लिए उपयोग करें कॉलम (कोड slug कॉलम origString कॉलम के मान के अनुसार सेट करता है:

UPDATE myTable 
SET slug = REPLACE(LOWER(origString), ' ', '-') 
+3

एक यूनिकोड स्ट्रिंग को ठीक से स्लगिफाइफ़ करने के लिए आपको इससे अधिक की आवश्यकता होगी। कम से कम सभी गैर-असीसी पात्रों का सामना करना चाहिए। – Constantin

3

यहाँ जेरेमी की प्रतिक्रिया का एक परिवर्तन हो। यह तकनीकी रूप से slugifying नहीं हो सकता है क्योंकि मैं कुछ कस्टम चीजें कर रहा हूँ जैसे "।" "-डॉट-" के साथ, और apostrophes अलग करना। मुख्य सुधार यह है कि यह लगातार सभी रिक्त स्थानों को भी मिटा देता है, और पूर्ववर्ती डैश को बाहर नहीं करता है।

create function dbo.Slugify(@str nvarchar(max)) returns nvarchar(max) 
as 
begin 
    declare @IncorrectCharLoc int 
    set @str = replace(replace(lower(@str),'.',' dot '),'''','') 

    -- remove non alphanumerics: 
    set @IncorrectCharLoc = patindex('%[^0-9a-z -]%',@str) 
    while @IncorrectCharLoc > 0 
    begin 
     set @str = stuff(@str,@incorrectCharLoc,1,' ') 
     set @IncorrectCharLoc = patindex('%[^0-9a-z -]%',@str) 
    end 
    -- remove consecutive spaces: 
    while charindex(' ',@str) > 0 
    begin 
    set @str = replace(@str, ' ', ' ') 
    end 
    set @str = replace(@str,' ','-') 
return @str 
end 
+0

बहुत उपयोगी। दो चीजें जो मैंने देखी हैं, इस स्क्रिप्ट को पीछे नहीं रखा गया था (शायद अग्रणी?) रिक्त इनपुट जो एक बंद माता पिता के साथ समाप्त होता है एक पिछला हाइफ़न छोड़ दिया। पहले के लिए, इनपुट ट्रिम करें। दूसरे के लिए, मुझे यकीन नहीं है क्योंकि एक पिछला हाइफ़न उद्देश्य पर हो सकता है ... –

3

मैं लगातार सभी डैश के बाद भी रिक्त स्थान बदल दिया जाता है को हटाकर एक दो कदम आगे जेरेमी की प्रतिक्रिया ले लिया, और प्रमुख और डैश अनुगामी हटा दिया।

create function dbo.Slugify(@str nvarchar(max)) returns nvarchar(max) as 
begin 
    declare @IncorrectCharLoc int 
    set @str = replace(replace(lower(@str),'.','-'),'''','') 

    -- remove non alphanumerics: 
    set @IncorrectCharLoc = patindex('%[^0-9a-z -]%',@str) 
    while @IncorrectCharLoc > 0 
    begin 
     set @str = stuff(@str,@incorrectCharLoc,1,' ') 
     set @IncorrectCharLoc = patindex('%[^0-9a-z -]%',@str) 
    end 

    -- replace all spaces with dashes 
    set @str = replace(@str,' ','-') 

    -- remove consecutive dashes: 
    while charindex('--',@str) > 0 
    begin 
     set @str = replace(@str, '--', '-') 
    end 

    -- remove leading dashes 
    while charindex('-', @str) = 1 
    begin 
     set @str = RIGHT(@str, len(@str) - 1) 
    end 

    -- remove trailing dashes 
    while len(@str) > 0 AND substring(@str, len(@str), 1) = '-' 
    begin 
     set @str = LEFT(@str, len(@str) - 1) 
    end 
return @str 
end 
0
-- Converts a title such as "This is a Test" to an all lower case string such 
-- as "this-is-a-test" for use as the slug in a URL. All runs of separators 
-- (whitespace, underscore, or hyphen) are converted to a single hyphen. 
-- This is implemented as a state machine having the following four states: 
-- 
--  0 - initial state 
--  1 - in a sequence consisting of valid characters (a-z, A-Z, or 0-9) 
--  2 - in a sequence of separators (whitespace, underscore, or hyphen) 
--  3 - encountered a character that is neither valid nor a separator 
-- 
-- Once the next state has been determined, the return value string is 
-- built based on the transitions from the current state to the next state. 
-- 
-- State 0 skips any initial whitespace. State 1 includes all valid slug 
-- characters. State 2 converts multiple separators into a single hyphen 
-- and skips trailing whitespace. State 3 skips any punctuation between 
-- between characters and, if no additional whitespace is encountered, 
-- then the punctuation is not treated as a word separator. 
-- 
CREATE FUNCTION ToSlug(@title AS NVARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @retval AS VARCHAR(MAX) = ''; -- return value 
    DECLARE @i AS INT = 1;    -- title index 
    DECLARE @c AS CHAR(1);    -- current character 
    DECLARE @state AS INT = 0;   -- current state 
    DECLARE @nextState AS INT;   -- next state 
    DECLARE @tab AS CHAR(1) = CHAR(9); -- tab 
    DECLARE @lf AS CHAR(1) = CHAR(10); -- line feed 
    DECLARE @cr AS CHAR(1) = CHAR(13); -- carriage return 
    DECLARE @separators AS CHAR(8) = '[' + @tab + @lf + @cr + ' _-]'; 
    DECLARE @validchars AS CHAR(11) = '[a-zA-Z0-9]'; 

    WHILE (@i <= LEN(@title)) 
    BEGIN 
     SELECT @c = SUBSTRING(@title, @i, 1), 

     @nextState = CASE 
      WHEN @c LIKE @validchars THEN 1 
      WHEN @state = 0 THEN 0 
      WHEN @state = 1 THEN CASE 
       WHEN @c LIKE @separators THEN 2 
       ELSE 3 -- unknown character 
       END 
      WHEN @state = 2 THEN 2 
      WHEN @state = 3 THEN CASE 
       WHEN @c LIKE @separators THEN 2 
       ELSE 3 -- stay in state 3 
       END 
      END, 

     @retval = @retval + CASE 
      WHEN @nextState != 1 THEN '' 
      WHEN @state = 0 THEN LOWER(@c) 
      WHEN @state = 1 THEN LOWER(@c) 
      WHEN @state = 2 THEN '-' + LOWER(@c) 
      WHEN @state = 3 THEN LOWER(@c) 
      END, 

     @state = @nextState, 

     @i = @i + 1 
    END 
    RETURN @retval; 
END 
+0

क्या आप और टिप्पणी जोड़ सकते हैं? –

3

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन भावी पीढ़ी के लिए, मैं एक समारोह है कि यहां तक ​​कि लहजे here के साथ संबंधित पाया:

CREATE function [dbo].[slugify](@string varchar(4000)) 
    RETURNS varchar(4000) AS BEGIN 
    declare @out varchar(4000) 

    --convert to ASCII 
    set @out = lower(@string COLLATE SQL_Latin1_General_CP1251_CS_AS) 

    declare @pi int 
    --I'm sorry T-SQL have no regex. Thanks for patindex, MS .. :-) 
    set @pi = patindex('%[^a-z0-9 -]%',@out) 
    while @pi>0 begin 
     set @out = replace(@out, substring(@out,@pi,1), '') 
     --set @out = left(@out,@pi-1) + substring(@out,@pi+1,8000) 
     set @pi = patindex('%[^a-z0-9 -]%',@out) 
    end 

    set @out = ltrim(rtrim(@out)) 

    -- replace space to hyphen 
    set @out = replace(@out, ' ', '-') 

    -- remove double hyphen 
    while CHARINDEX('--', @out) > 0 set @out = replace(@out, '--', '-') 

    return (@out) 
END 
+0

अक्षरों को स्ट्रिप्स करने के लिए 'COLLATE SQL_Latin1_General_CP1251_CS_AS' का उपयोग करके केवल वर्चर्स चर के साथ काम करता है। यदि आप nvarchar चर के साथ ऐसा करने का प्रयास करते हैं, तो कुछ भी नहीं होता है। यदि इनपुट nvarchar है तो इसे 'कास्ट (वर्स्टर के रूप में @ स्ट्रिंग) का उपयोग करके स्पष्ट रूप से कुछ बिंदु पर वर्चर में परिवर्तित करना होगा। यदि आप नहीं करते हैं, तो उच्चारण वहां रहेंगे जहां वे हैं। – jahu

+0

अतिरिक्त लंबाई के साथ कास्ट का उपयोग करने की आवश्यकता हो सकती है क्योंकि SQL सर्वर आपकी स्ट्रिंग को छोटा करता है यदि इसे 'SELECT' कथन के अंदर' वर्कर 'में परिवर्तित किया गया है। उदाहरण के लिए 'कास्ट (वर्स्टर (500) के रूप में @ स्ट्रिंग) '। – jahu

0
To slug with Vietnamese unicode  

CREATE function [dbo].[toslug](@string nvarchar(4000)) 
    RETURNS varchar(4000) AS BEGIN 
    declare @out nvarchar(4000) 
    declare @from nvarchar(255) 
    declare @to varchar(255) 
    --convert to ASCII dbo.slugify 
    set @string = lower(@string) 
    set @out = @string 
    set @from = N'ýỳỷỹỵáàảãạâấầẩẫậăắằẳẵặéèẻẽẹêếềểễệúùủũụưứừửữựíìỉĩịóòỏõọơớờởỡợôốồổỗộđ·/_,:;' 
    set @to = 'yyyyyaaaaaaaaaaaaaaaaaeeeeeeeeeeeuuuuuuuuuuuiiiiioooooooooooooooood------' 
    declare @pi int 
    set @pi = 1 
    --I'm sorry T-SQL have no regex. Thanks for patindex, MS .. :-) 
    while @pi<=len(@from) begin 
     set @out = replace(@out, substring(@from,@pi,1), substring(@to,@pi,1)) 
     set @pi = @pi + 1 
    end 
    set @out = ltrim(rtrim(@out)) 

    -- replace space to hyphen 
    set @out = replace(@out, ' ', '-') 

    -- remove double hyphen 
    while CHARINDEX('--', @out) > 0 set @out = replace(@out, '--', '-') 

    return (@out) 
END 
+1

कृपया देखें कि आपकी पोस्ट ने कैसे प्रस्तुत किया है, और [स्वरूपण को ठीक करने के लिए इसे संपादित करें] (http://stackoverflow.com/posts/42667458/edit)। पोस्ट-एडिटिंग एरिया में आपको एक आसान छोटा पूर्वावलोकन मिलता है ताकि आप इसे देख सकें कि इसे सबमिट करने से पहले यह कैसा दिख रहा है। – AakashM

+2

यह लिंक आपके लिए उपयोगी हो सकता है - [उत्तर] – Tom

+0

धन्यवाद @ आकाशम मुझे मिल गया –

संबंधित मुद्दे