urlencode com funções só embutidos

votos
3

Sem usar plpgsql, eu estou tentando urlencode um determinado texto dentro de uma instrução SELECT pgsql.

O problema com essa abordagem:

select regexp_replace('héllo there','([^A-Za-z0-9])','%' || encode(E'\\1','hex'),'g')

... é que a função de codificação não é passado o parâmetro de expressão regular, a menos que haja outra maneira de chamar funções de dentro da expressão de substituição que realmente funciona. Então, eu estou querendo saber se há uma expressão de substituição que, por si só, pode codificar partidas em valores hexadecimais.

Pode haver outras combinações de funções. Eu pensei que haveria uma regex inteligente (e que ainda pode ser a resposta) lá fora, mas eu estou tendo problemas para encontrá-lo.

Publicado 04/12/2008 em 16:51
fonte usuário
Em outras línguas...                            


4 respostas

votos
6

select regexp_replace(encode('héllo there','hex'),'(..)',E'%\\1','g');

Isto não deixa os caracteres alfanuméricos legíveis, no entanto.

Respondeu 04/12/2008 em 17:38
fonte usuário

votos
-3

Você pode usar CLR e importar o namespace ou usar a função mostrada neste link, isso cria uma função T-SQL que faz a codificação.

http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/03/09/28987.aspx

Respondeu 08/12/2008 em 14:29
fonte usuário

votos
1

Aqui está uma função que eu escrevi que lida com a codificação utilizando o construído em funções, preservando a legibilidade do URL.

Regex corresponde capturar pares de (opcional) caracteres seguras e (no máximo um) de caracteres não-segura. selecciona aninhados permitir que os pares a ser codificado e re-combinado devolver uma cadeia totalmente codificado.

Já corri através de um conjunto de testes com todos os tipos de permutações (que conduzem / arrastando / única / repetidos caracteres codificados e, até agora, parece codificar corretamente.

Os caracteres especiais seguros são _ ~. - e /. Meu inclusão de "/" nessa lista é provavelmente fora do padrão, mas se encaixa no caso de uso Eu tenho onde o texto de entrada pode ser um caminho e eu quero que permaneça.

CREATE OR REPLACE FUNCTION oseberg.encode_uri(input text)
  RETURNS text
  LANGUAGE plpgsql
  IMMUTABLE STRICT
AS $function$
DECLARE
  parsed text;
  safePattern text;
BEGIN
  safePattern = 'a-zA-Z0-9_~/\-\.';
  IF input ~ ('[^' || safePattern || ']') THEN
    SELECT STRING_AGG(fragment, '')
    INTO parsed
    FROM (
      SELECT prefix || encoded AS fragment
      FROM (
        SELECT COALESCE(match[1], '') AS prefix,
               COALESCE('%' || encode(match[2]::bytea, 'hex'), '') AS encoded
        FROM (
          SELECT regexp_matches(
            input,
            '([' || safePattern || ']*)([^' || safePattern || '])?',
            'g') AS match
        ) matches
      ) parsed
    ) fragments;
    RETURN parsed;
  ELSE
    RETURN input;
  END IF;
END;
$function$
Respondeu 09/11/2015 em 19:08
fonte usuário

votos
0

Aqui é a versão muito curta, e é ainda a função "pura SQL", não plpgsql. caracteres de bytes múltiplos (incluindo os 3- e 4-bytes emoji) são suportados.

create or replace function urlencode(in_str text, OUT _result text) returns text as $$
  select
    string_agg(
      case
        when ol>1 or ch !~ '[0-9a-za-z:/@._?#-]+' 
          then regexp_replace(upper(substring(ch::bytea::text, 3)), '(..)', E'%\\1', 'g')
        else ch
      end,
      ''
    )
  from (
    select ch, octet_length(ch) as ol
    from regexp_split_to_table($1, '') as ch
  ) as s;
$$ language sql immutable strict;
Respondeu 19/10/2016 em 02:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more