2009-03-04 20 views
18

Tengo una cadena como "foo% 20bar" y quiero "foo bar" fuera de ella.Cómo "decodificar URL" una cadena en Emacs Lisp?

Sé que tiene que haber una función incorporada para decodificar una cadena codificada en URL (cadena de consulta) en Emacs Lisp, pero por mi vida no puedo encontrarla hoy, ni en mi lisp/carpeta o con google

¿Alguien recuerda cómo se llama?

Respuesta

3

org-link-unescape hace el trabajo para casos muy simples ... w3m-url-decode-string es mejor, pero no se construye en y la versión que tengo a nivel local no está funcionando con Emacs 23.

+0

Eso es suficiente por ahora. Sin embargo, es extraño que solo use una lista constante de 17 caracteres. Tal vez lo arregle en algún momento. – Ken

+8

'url-unhex-string' hace lo que quiere. – Cheeso

-1

Creo que lo está haciendo un poco difícil: split-string probablemente haga la mayor parte de lo que quiera. Para cosas más elegantes, eche un vistazo a las funciones en url-expand.el; desafortunadamente, muchos de ellos no tienen doc-strings, por lo que es posible que tengas que leer el código.

url-generic-parse-url parece un posible ganador.

+0

Hmm, tal vez me equivoque. Tengo una cadena como "foo% 20bar" y quiero "foo bar" fuera de ella. No veo cómo split-string o url-generic-parse-url o cualquier cosa en url-expand.el realmente ayuda aquí. – Ken

8

Emacs es enviado con un URL library, que proporciona un conjunto de funciones de análisis de URL, como huaiyuan y Charlie Martin ya señalado. Aquí hay un pequeño ejemplo que le daría una idea de cómo se usa:

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

Creo que es mejor confiar en él que org-mode ya que es su principal objetivo de analizar la URL.

+0

encanta este ejemplo! – osager

23

En mi caso, necesitaba hacer esto de forma interactiva. Las respuestas anteriores me dieron las funciones correctas para llamar, entonces era sólo una cuestión de envolver un poco para hacerlos interactivo:

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

Añadir la sal, es decir se unen a las teclas según el gusto.

Cuestiones relacionadas