Android - Regex-Pattern隐藏html输入字段的值

时间:2014-05-05 09:14:40

标签: android html regex token hidden

regex-patterns我很新/不好,但这就是我想要的:

我有一个带有html的网页,在该网页的某个地方我有:<input name="__RequestVerificationToken" type="hidden" value="the_value_I_want" />

所以,我的问题是:如何在 Android 中获取hidden text field的值(the_value_I_want)?

我确实已经制作了HttpGet(请参阅下面的代码),我只需要知道正确的Pattern

代码:

// Method to get the hidden-input value of the Token
private String getToken(){
    String url = "http://myhost/Account/Login";
    String hidden_token = "";
    String response = "";

    HttpGet get = new HttpGet(url);
    try{
        // Send the GET-request
        HttpResponse execute = MainActivity.HttpClient.execute(get);

        // Get the response of the GET-request
        InputStream content = execute.getEntity().getContent();
        BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
        String s = "";
        while((s = buffer.readLine()) != null)
            response += s;
    }
    catch(Exception ex){
        ex.printStackTrace();
    }

    // Get the value of the hidden input-field with the name __RequestVerificationToken
    Pattern pattern = Pattern.compile("<input name=\"" + TOKEN + "\" type=\"hidden\" value=\".\" />", Pattern.DOTALL);
    Matcher matcher = pattern.matcher(response);
    while(matcher.find())
        hidden_token = matcher.group();

    return hidden_token;
}

那么,我应该用以下哪一行代替?

Pattern pattern = Pattern.compile("<input name=\"" + TOKEN + "\" type=\"hidden\" value=\".\" />", Pattern.DOTALL);

或者我应该改变别的东西吗?

提前感谢您的回复。

PS:对于那些想知道的人:我需要这个令牌才能使用POST-request的Google帐户登录,并结合我token获得的Cookie


编辑1:

在阅读this stackoverflow question的答案后,我认为最好不要在HTML页面中使用正则表达式模式。有没有人知道更好的解决方案(如果这个更好的解决方案是代码示例,我将不胜感激。)


编辑2:

我尝试使用Illegal Argument的答案并添加了Jsoup库。我确实设法通过对上面的代码进行以下更改来获取令牌:

将try {...}中的所有内容替换为:

// Get the value of the hidden input-field with the name __RequestVerificationToken
Document doc = Jsoup.connect(url).get();
org.jsoup.nodes.Element el = doc.select("input[name*=" + TOKEN).first();
hidden_token = el.attr("value");

这确实让我得到了隐藏字段的标记,但现在我有了一个全新的问题..标记已更改,因为Jsoup打开了一个新会话。所以基本上我不能使用Jsoup并且“被迫”使用我也用于POST的已经打开的DefaultHttpClient。

我会为此提出一个新问题,因为我原来的回答只是我自己的质疑(没有提供所有细节)所以我接受非法论证的回答是正确的(虽然它没有解决我的当前问题,它可能会帮助其他人。)

1 个答案:

答案 0 :(得分:1)

尝试使用Jsoup库。它是为此目的而构建的正则表达式解析器。