sql - online - w3c encode url
urlencode con solo funciones incorporadas (4)
Puede usar CLR e importar el espacio de nombres o usar la función que se muestra en este enlace, esto crea una función T-SQL que hace la codificación.
http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/03/09/28987.aspx
Sin usar plpgsql, estoy tratando de urlencode un texto dado dentro de una instrucción pgsql SELECT.
El problema con este enfoque:
select regexp_replace(''héllo there'',''([^A-Za-z0-9])'',''%'' || encode(E''//1'',''hex''),''g'')
... es que a la función de codificación no se le pasa el parámetro de expresión regular, a menos que haya otra forma de invocar funciones desde la expresión de reemplazo que realmente funciona. Entonces me pregunto si hay una expresión de reemplazo que, por sí misma, pueda codificar coincidencias en valores hexadecimales.
Puede haber otras combinaciones de funciones. Pensé que habría una expresión regular inteligente (y esa podría ser la respuesta), pero estoy teniendo problemas para encontrarla.
select regexp_replace(encode(''héllo there'',''hex''),''(..)'',E''%//1'',''g'');
Sin embargo, esto no deja los caracteres alfanuméricos legibles para los humanos.
Aquí hay una función que escribí que maneja la codificación usando funciones integradas mientras se preserva la legibilidad de la URL.
Regex coincide para capturar pares de caracteres seguros (opcionales) y (como máximo un) carácter no seguro. Las selecciones anidadas permiten que esos pares se codifiquen y se vuelvan a combinar para devolver una cadena totalmente codificada.
He revisado un conjunto de pruebas con todo tipo de permutaciones (caracteres codificados iniciales / finales / solo / repetidos y hasta ahora parece codificarse correctamente).
Los personajes especiales seguros son _ ~. - y / Mi inclusión de "/" en esa lista probablemente no sea estándar, pero se ajusta al caso de uso que tengo, donde el texto de entrada puede ser una ruta y quiero que permanezca.
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$
Aquí hay una versión bastante corta, e incluso es función "pura SQL", no plpgsql. Se admiten caracteres múltiples (incluidos emoji de 3 y 4 bytes).
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;