1

正規表現を使用して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
4

3 に答える 3

3

これは恐ろしく見えますが、私はそれがどのように見えるかについて責任を負いません-このばかげた標準を発明した人々は...しかし、これは標準(Unicode文字とその翻訳を含まない古いバージョン)に非常に厳密に従う必要があります:

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

これは、一部の「役立つ」プログラムが、パーセントでエンコードされた URI コンポーネントから元のエンコードされていない形式への変換を既に行っていない限りです。

また、URL の部分の長さには技術的な制限がいくつかありますが、それを実装しようとはしません...

また、基本認証のような認証スキームは使用されないことを前提としています。それ以外の場合は、正規表現を使用しない方がはるかに簡単です。

于 2012-09-26T19:07:37.213 に答える
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)))))
于 2012-09-27T16:00:07.137 に答える
2

次のようなものはどうでしょうか (これは、すべての URL に「://」が含まれていることを前提としています):

(re-search-forward "^x-url: [^:]*://\\([^?\r\n]+\\).*?$")
于 2012-09-26T17:34:51.113 に答える