Lua帮助我优化我的模式匹配函数

有没有一种方法可以摆脱最后两个gsub,并使此函数对所有捕获模式使用单个替换表?

function sanitize(txt)
    local replacements = {
        ['&' ] = '&',
        ['<' ] = '&lt;',
        ['>' ] = '&gt;',
        ['\n'] = '<br/>'
    }
    return txt
        :gsub('[&<>\n]', replacements)
        :gsub(' +', ' ')
        :gsub('%^%d', '')
end

原文链接 https://stackoverflow.com/questions/68972797

点赞
stackoverflow用户11740758
stackoverflow用户11740758

如果我理解正确,那么要像这样做...

function sanitize(txt)
    local replacements = {
        ['&'] = '&amp;',
        ['<'] = '&lt;',
        ['>'] = '&gt;',
        ['\n'] = '<br/>',
        ['+'] = '',
        ['^'] = '',
        ['1'] = '',
        ['2'] = '',
        ['3'] = '',
        ['4'] = '',
        ['5'] = '',
        ['6'] = '',
        ['7'] = '',
        ['8'] = '',
        ['9'] = '',
        ['0'] = ''
    }
    return txt:gsub('.', replacements)
end
2021-08-29 14:30:59
stackoverflow用户1847592
stackoverflow用户1847592

有没有办法让这个函数对所有捕获模式使用单个替换表?

有。

但你不会想使用它 :-)

function sanitize(txt)
   local replacements = {
      -- 只保留最多 3 个空格; 为较长的空格链添加更多条目到该表中
      ['&' ] = '&amp;', ['& ' ] = '&amp; ', ['&  ' ] = '&amp; ', ['&   ' ] = '&amp; ',
      ['<' ] = '&lt;',  ['< ' ] = '&lt; ',  ['<  ' ] = '&lt; ',  ['<   ' ] = '&lt; ',
      ['>' ] = '&gt;',  ['> ' ] = '&gt; ',  ['>  ' ] = '&gt; ',  ['>   ' ] = '&gt; ',
      ['\n'] = '<br/>', ['\n '] = '<br/> ', ['\n  '] = '<br/> ', ['\n   '] = '<br/> ',
      ['  ' ] = ' ', ['   ' ] = ' ',

      ['0  '] = '0 ', ['0   '] = '0 ',
      ['1  '] = '1 ', ['1   '] = '1 ',
      ['2  '] = '2 ', ['2   '] = '2 ',
      ['3  '] = '3 ', ['3   '] = '3 ',
      ['4  '] = '4 ', ['4   '] = '4 ',
      ['5  '] = '5 ', ['5   '] = '5 ',
      ['6  '] = '6 ', ['6   '] = '6 ',
      ['7  '] = '7 ', ['7   '] = '7 ',
      ['8  '] = '8 ', ['8   '] = '8 ',
      ['9  '] = '9 ', ['9   '] = '9 ',

      ['^&' ] = '^&amp;', ['^& ' ] = '^&amp; ', ['^&  ' ] = '^&amp; ', ['^&   ' ] = '^&amp; ',
      ['^<' ] = '^&lt;',  ['^< ' ] = '^&lt; ',  ['^<  ' ] = '^&lt; ',  ['^<   ' ] = '^&lt; ',
      ['^>' ] = '^&gt;',  ['^> ' ] = '^&gt; ',  ['^>  ' ] = '^&gt; ',  ['^>   ' ] = '^&gt; ',
      ['^\n'] = '^<br/>', ['^\n '] = '^<br/> ', ['^\n  '] = '^<br/> ', ['^\n   '] = '^<br/> ',
      ['^ '] = ' ', ['^  '] = ' ', ['^   '] = ' ',

      ['^0'] = '', ['^0 '] = ' ', ['^0  '] = ' ', ['^0   '] = ' ',
      ['^1'] = '', ['^1 '] = ' ', ['^1  '] = ' ', ['^1   '] = ' ',
      ['^2'] = '', ['^2 '] = ' ', ['^2  '] = ' ', ['^2   '] = ' ',
      ['^3'] = '', ['^3 '] = ' ', ['^3  '] = ' ', ['^3   '] = ' ',
      ['^4'] = '', ['^4 '] = ' ', ['^4  '] = ' ', ['^4   '] = ' ',
      ['^5'] = '', ['^5 '] = ' ', ['^5  '] = ' ', ['^5   '] = ' ',
      ['^6'] = '', ['^6 '] = ' ', ['^6  '] = ' ', ['^6   '] = ' ',
      ['^7'] = '', ['^7 '] = ' ', ['^7  '] = ' ', ['^7   '] = ' ',
      ['^8'] = '', ['^8 '] = ' ', ['^8  '] = ' ', ['^8   '] = ' ',
      ['^9'] = '', ['^9 '] = ' ', ['^9  '] = ' ', ['^9   '] = ' ',
   }
   return txt:gsub('%^?[&<>\n%d ] *', replacements)
end
2021-08-30 09:09:43