2009-03-04 8 views
18

Ho una stringa come "foo% 20bar" e voglio "foo bar".Come "decodificare l'URL" una stringa in Emacs Lisp?

So che ci deve essere una funzione built-in per decodificare una stringa con codifica URL (stringa di query) in Emacs Lisp, ma per la vita di me non riesco a trovarla oggi, né nella mia cartella/cartella o con google.

Qualcuno ricorda come si chiama?

risposta

3

org-link-unescape fa il lavoro per i casi molto semplici ... w3m-url-decode-string è meglio, ma non è costruito in e la versione che ho a livello locale non funziona con Emacs 23.

+0

Questo è abbastanza buono per ora. È strano che usi solo una lista costante di 17 caratteri, però. Forse lo aggiusterò prima o poi. – Ken

+8

'url-unhex-string' fa quello che vuoi. – Cheeso

-1

Penso che lo stiate rendendo un po 'troppo difficile: lo split-string probabilmente farà la maggior parte di ciò che volete. Per cose più appassionate, dai un'occhiata alle funzioni in url-expand.el; sfortunatamente, molti di loro non hanno stringhe doc, quindi potrebbe essere necessario leggere il codice.

url-generic-parse-url sembra un potenziale vincitore.

+0

Hmm, forse ho misspoke. Ho una stringa come "foo% 20bar" e voglio "foo bar" fuori di esso. Non vedo come split-string o url-generic-parse-url o qualsiasi cosa in url-expand.el aiuti davvero qui. – Ken

8

Emacs è spedito con un URL library, che fornisce una serie di funzioni di analisi degli URL, come già indicato in huaiyuan e Charlie Martin. Ecco un piccolo esempio che darei un'idea come usarlo:

(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")) 

penso che sia meglio fare affidamento su di essa rispetto org-mode come è il suo scopo principale per analizzare URL.

+0

ama questo esempio! – osager

23

Nel mio caso ho dovuto farlo in modo interattivo. Le risposte precedenti mi ha dato le funzioni giuste per chiamare, quindi era solo una questione di avvolgendolo un po 'per renderli interattivi:

(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)) 

aggiungere il sale, voglio dire si legano ai tasti a seconda dei gusti.