2009-03-04 21 views
18

Mam ciąg taki jak "foo% 20bar" i chcę "foo bar" z niego.Jak "dekodować URL" ciąg w Emacs Lisp?

Wiem, że musi istnieć wbudowana funkcja do dekodowania łańcucha zakodowanego w adresie URL (ciąg zapytania) w Emacs Lisp, ale dla mojego życia nie mogę go znaleźć dzisiaj, ani w moim lisp/folderze lub z google.

Ktoś pamięta, jak się nazywa?

Odpowiedz

3

org-link-unescape ma pracy dla bardzo prostych przypadkach ... w3m-url-decode-string jest lepsza, ale to nie jest zbudowany i wersja mam lokalnie nie działa z Emacs 23.

+0

To wystarczy na razie. Dziwne jest, że używa tylko stałej listy 17 znaków. Może kiedyś to rozwiążę. – Ken

+8

'url-unhex-string' robi to, co chcesz. – Cheeso

-1

Myślę, że robisz to trochę za mocno: split-string prawdopodobnie zrobi większość tego, co chcesz. Aby uzyskać więcej ciekawych rzeczy, zapoznaj się z funkcjami w url-expand.el; Niestety, wiele z nich nie ma napisów, więc możesz przeczytać kod.

url-generic-parse-url wygląda jak potencjalny zwycięzca.

+0

Hmm, może pomyłkę. Mam ciąg "foo% 20bar" i chcę "foo bar" z niego. Nie widzę tutaj, jak naprawdę pomaga tutaj parametr splatt-string lub url-generic-parse-url lub cokolwiek w url-expand.el. – Ken

8

Emacs jest dostarczany z URL library, która zapewnia wiele funkcji analizowania adresów URL - jak już wcześniej wskazano, huaiyuan i Charlie Martin. Oto mały przykład to, że daje wyobrażenie, jak z niego korzystać:

(let ((url "http://www.google.hu/search?q=elisp+decode+url&btnG=Google+keres%E9s&meta=")) 
    ;; Return list of arguments and values 
    (url-parse-query-string 
    ;; Decode hexas 
    (url-unhex-string 
    ;; Retrieve argument list 
    (url-filename 
    ;; Parse URL, return a struct 
    (url-generic-parse-url url))))) 
=> (("meta" "") ("btnG" "Google+keresés") ("/search?q" "elisp+decode+url")) 

myślę lepiej jest polegać na nim niż org-mode gdyż jest jego głównym celem analizowania URL.

+0

kocham ten przykład! – osager

23

W moim przypadku musiałem zrobić to interaktywnie. Dotychczasowe odpowiedzi dał mi prawo funkcje zadzwonić, to była tylko kwestia owijając go trochę, aby były interaktywne:

(defun func-region (start end func) 
    "run a function over the region between START and END in current buffer." 
    (save-excursion 
    (let ((text (delete-and-extract-region start end))) 
     (insert (funcall func text))))) 

(defun hex-region (start end) 
    "urlencode the region between START and END in current buffer." 
    (interactive "r") 
    (func-region start end #'url-hexify-string)) 

(defun unhex-region (start end) 
    "de-urlencode the region between START and END in current buffer." 
    (interactive "r") 
    (func-region start end #'url-unhex-string)) 

Dodać sól, to znaczy wiążą się z kluczy do smaku.

Powiązane problemy