這是我寫的編碼使用內置的功能,同時保留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$
PostgreSQL,而不是SQL Server。 – derobert 2008-12-09 03:06:25
此外,我試圖只使用內置,即,我不想創建一個函數或存儲過程。 – Kev 2009-01-05 16:28:28