如何在Emacs正则表达式中安全地提取URL

时间:2012-09-26 16:36:25

标签: regex emacs elisp

我在使用正则表达式从HTTP标头中可靠地提取URL时遇到了一个问题。有没有^ M字符交替到达的标题没有帮助,这些字符似乎与白色空间类不匹配。目前我所管理的最好的是:

(re-search-forward "^x-url: .*/\\{2,3\\}\\(.*\\)" nil t)

但当然,如果它存在,那么它也会选择^ M以及我不需要的URL参数。举个例子来说明我的调试:

x-url: http://wiki/mediawiki/index.php?title=Vsmux&action=edit&redlink=1
x-url: http://wiki/mediawiki/index.php?title=Vsmux&action=edit&redlink=1^M

在这两种情况下我真正想要的只是结果:

wiki/mediawiki/index.php

3 个答案:

答案 0 :(得分:3)

这看起来很可怕,但我不负责它的外观 - 发明这种愚蠢标准的人是......但这应该遵循标准(旧版本,不包括Unicode字符及其翻译)非常密切地说:

"^x-url:\\s-*\\(\\w\\|\\+\\|-\\)+://\\(\\w\\|\\-\\)+\\(\\.\\w+\\)?\\(\\/\\(%[0-9a-fA-F]\\{2\\}\\|[~\\.A-Za-z_+-]*\\)*\\)*"

除非某些“有用”程序已经从百分比编码的URI组件转换为其原始的非编码形式。

此外,URL的各个部分可能存在一些技术限制,我不打算尝试实现...

此外,它假定从不使用基本身份验证中的身份验证方案。否则,没有正则表达式会更容易。

答案 1 :(得分:2)

类似的东西(假设所有网址中都包含“://”):

(re-search-forward "^x-url: [^:]*://\\([^?\r\n]+\\).*?$")

答案 2 :(得分:2)

为了完整性,我应该添加另一个解决方案,我已经尝试过与@wvxvw讨论使用正确的解析器。这使得elisp代码看起来有点像这样:

(save-excursion
  (let* ((url-string (url-get-url-at-point (re-search-forward "^x-url: ")))
         (url (url-generic-parse-url url-string))
         (arg-split (string-match-p "?" (url-filename url))))
    (format "%s%s" (url-host url)
        (if arg-split
            (substring (url-filename url) 0 arg-split)
          (url-filename url)))))