1

今夜これで家々を回った。私がやりたいのは、次のスクリプトで csrf-token を引き出すことですが、それは返されますnil

local html = '<meta content="authenticity_token" name="csrf-param" /><meta content="ndcZ+Vp8MuM/hF6LizdrvJqgcRh22zF8w/DnIX0DvR0=" name="csrf-token" />'

local csrf_token = string.match(html, 'content="(.*)" name="csrf-token"')

スクリプトを変更して「-token」部分を削除すると、何かに一致しますが、もちろん正しいことではありません。

文字列を「csrftoken」に変更すると、一致が期待どおりに機能するため、ハイフンであることはわかっています。

- をエスケープしようとしました\-が、エラーが発生しました...

エル・P...

4

2 に答える 2

2

2 つの問題があります。

  1. -エスケープする必要がありますが、Lua は%代わりに を使用し\ます。

  2. さらに、奇妙な結果が得られる理由は、.タグ (または属性) 全体を含むあらゆるものに一致する可能性があり、可能な限り取得しようとするためです (エンジンは可能な限り左端の一致を返すため、貪欲でない量指定子はどちらも助けません)。あなたがすべきことは、キャプチャされたものが属性引用符の外に出ないように、許可された文字を制限することです-のように[^"](引用符以外の任意の文字):

これらをすべてまとめると、次のようになります。

local csrf_token = string.match(html, 'content="([^"]*)" name="csrf%-token"')

いずれにせよ、実際には HTML を正規表現と一致させるべきではありません

于 2013-06-11T21:06:19.760 に答える
0
name="csrf-token'"

この行の最後に余分なアポストロフィがあります。

また、" = とハイフンもエスケープしますが、これはこれらすべての文字に必要ではないかもしれません。

于 2013-06-11T21:04:04.560 に答える