我在使用正则表达式从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
答案 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)))))