4

在不使用 plpgsql 的情况下,我试图在 pgsql SELECT 语句中对给定文本进行 urlencode。

这种方法的问题:

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

...是编码函数没有传递正则表达式参数,除非有另一种方法可以从实际有效的替换表达式中调用函数。所以我想知道是否有一个替换表达式本身可以将匹配项编码为十六进制值。

可能还有其他功能组合。我认为那里会有一个聪明的正则表达式(这可能仍然是答案),但我很难找到它。

4

4 回答 4

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

但是,这不会使字母数字字符易于阅读。

于 2008-12-04T16:38:30.567 回答
1

这是我编写的一个函数,它使用内置函数处理编码,同时保留 URL 的可读性。

正则表达式匹配以捕获(可选)安全字符和(最多一个)非安全字符对。嵌套选择允许对这些对进行编码和重新组合,返回一个完全编码的字符串。

我已经运行了一个具有各种排列的测试套件(前导/尾随/仅/重复的编码字符,到目前为止它似乎编码正确。

安全的特殊字符是 _ ~ 。- 和 /。我在该列表中包含“/”可能是非标准的,但适合我的用例,其中输入文本可能是路径并且我希望保留它。

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$
于 2015-11-09T19:08:11.960 回答
1

这是相当短的版本,它甚至是“纯 SQL”函数,而不是 plpgsql。支持多字节字符(包括 3 和 4 字节表情符号)。

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;
于 2016-10-19T02:29:27.733 回答
-3

您可以使用 CLR 并导入命名空间或使用此链接中显示的函数,这将创建一个执行编码的 T-SQL 函数。

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

于 2008-12-08T13:29:16.327 回答