在Java中获取URL参数并从URL中提取特定文本

40

我有一个URL,需要从中获取v的值。

这是我的URL: http://www.youtube.com/watch?v=_RCIP6OrQrE

我该如何做呢?


什么是v?如果可以的话,请提供更多信息和代码。 - Harmeet Singh
你需要对YouTube URL进行什么操作吗?你是否需要使用子字符串方法从url-string中查找值v - sunil
我需要获取v=的值:http://www.youtube.com/watch?v=_RCIP6OrQrE - codezoner
@androidmaniac 看一下我的答案,它只返回 id - Harmeet Singh
@androidmaniac 嘿,安卓,顺便看看我的答案吧。我重写了它。该函数将支持多组YouTube网址。 - classicjonesynz
@androidmaniac,顺便说一下,我更新了我的答案。这段代码代表了从任何YouTube URL检索参数的更通用的方法。 - classicjonesynz
13个回答

72

我认为最简单的方法之一是将URL.getQuery()返回的字符串解析为

public static Map<String, String> getQueryMap(String query) {  
    String[] params = query.split("&");  
    Map<String, String> map = new HashMap<String, String>();

    for (String param : params) {  
        String name = param.split("=")[0];  
        String value = param.split("=")[1];  
        map.put(name, value);  
    }  
    return map;  
}
您可以使用该函数返回的映射来检索以参数名称为键的值。

4
这对于多值参数不起作用。在下面的例子中,EmployeeID参数有三个值:Northwest / Employee Sales Report&rs:Command = Render&EmployeeID = A&EmployeeID = B&EmployeeID = C您可以使用多值映射实现使其工作,而不是HashMap。我认为JRE没有任何这样的实现,但是可以在网络上轻松找到多值映射参数实现。 - DaBlick
1
对于像 example.com.com?paramexample.com?param= 这样的 URL,也会抛出 ArrayIndexOutOfBoundsException 异常。 - Panthro
1
我推荐这里的解决方案:https://dev59.com/mG025IYBdhLWcg3wnXWf - Panthro
如果值包含“=”符号,则此方法将无法正常工作。我将 String value = param.split("=")[1]; 改为 String value = param.split(name+"=")[1]; 现在似乎可以正常工作了。 - Dr. Gadget

30

如果你使用的是安卓系统,你可以按照以下步骤进行:

Uri uri = Uri.parse(url);
String v = uri.getQueryParameter("v");

4
请问这个包裹是包含什么内容的? - T J
@TJ 这是在Android SDK中。 - Noah Andrews

9
我有一个类似这样的东西:
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URIBuilder;

private String getParamValue(String link, String paramName) throws URISyntaxException {
        List<NameValuePair> queryParams = new URIBuilder(link).getQueryParams();
        return queryParams.stream()
                .filter(param -> param.getName().equalsIgnoreCase(paramName))
                .map(NameValuePair::getValue)
                .findFirst()
                .orElse("");
    }

3

上个月我为Joomla模块编写了这篇文章,用于实现YouTube视频(使用Gdata API)。之后我将其转换为java。

导入这些库

    import java.net.URL;
    import java.util.regex.*;

复制/粘贴此函数

    public String getVideoId( String videoId ) throws Exception {
        String pattern = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(videoId);
        int youtu = videoId.indexOf("youtu");
        if(m.matches() && youtu != -1){
            int ytu = videoId.indexOf("http://youtu.be/");
            if(ytu != -1) { 
                String[] split = videoId.split(".be/");
                return split[1];
            }
            URL youtube = new URL(videoId);
            String[] split = youtube.getQuery().split("=");
            int query = split[1].indexOf("&");
            if(query != -1){
                String[] nSplit = split[1].split("&");
                return nSplit[0];
            } else return split[1];
        }
        return null; //throw something or return what you want
    }

适用于以下URL

http://www.youtube.com/watch?v=k0BWlvnBmIE (General URL)
http://youtu.be/k0BWlvnBmIE (Share URL)
http://www.youtube.com/watch?v=UWb5Qc-fBvk&list=FLzH5IF4Lwgv-DM3CupM3Zog&index=2 (Playlist URL)

1
你应该使用 Arrays.toString(tokens) - rtheunissen
@paranoid-android +1个声望,谢谢。我明白,只是忘记了没有Eclipse打开的语法。 - classicjonesynz
1
请不要倡导手动解析URL。使用库来完成这个任务。 - Peter V. Mørch

3

导入这些库

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

与真实性相似,但具有处理多值参数的能力。注意:我见过没有值的HTTP GET请求,在这种情况下,该值将为null。

public static List<NameValuePair> getQueryMap(String query)  
{  
    List<NameValuePair> queryMap = new ArrayList<NameValuePair>();
    String[] params = query.split(Pattern.quote("&"));  
    for (String param : params)
    {
        String[] chunks = param.split(Pattern.quote("="));
        String name = chunks[0], value = null;  
        if(chunks.length > 1) {
            value = chunks[1];
        }
        queryMap.add(new BasicNameValuePair(name, value));
    }
    return queryMap;
}

例子:

GET /bottom.gif?e235c08=1509896923&%49%6E%...

3

使用纯Java 8

假设您想从URL中提取参数“v”:

             String paramV = Stream.of(url.split("?")[1].split("&"))
                        .map(kv -> kv.split("="))
                        .filter(kv -> "v".equalsIgnoreCase(kv[0]))
                        .map(kv -> kv[1])
                        .findFirst()
                        .orElse("");

2
我认为我们有更好的方法来回答这个问题。 1:定义一个返回Map值的函数。 下面开始。
public Map<String, String> getUrlValues(String url) throws UnsupportedEncodingException {
    int i = url.indexOf("?");
    Map<String, String> paramsMap = new HashMap<>();
    if (i > -1) {
        String searchURL = url.substring(url.indexOf("?") + 1);
        String params[] = searchURL.split("&");

        for (String param : params) {
            String temp[] = param.split("=");
            paramsMap.put(temp[0], java.net.URLDecoder.decode(temp[1], "UTF-8"));
        }
    }

    return paramsMap;
}

2: 在调用函数时加上try catch块

来吧,我们开始吧。

try {
     Map<String, String> values = getUrlValues("https://example.com/index.php?form_id=9&page=1&view_id=78");
     String formId = values.get("form_id");
     String page = values.get("page");
     String viewId = values.get("view_id");
     Log.d("FormID", formId);
     Log.d("Page", page);
     Log.d("ViewID", viewId);
} catch (UnsupportedEncodingException e) {
     Log.e("Error", e.getMessage());
} 

2
如果你正在使用 Jersey (就像我一样,我的服务器组件需要进行出站 HTTP 请求),它包含以下公共方法: var multiValueMap = UriComponent.decodeQuery(uri, true); 它是 org.glassfish.jersey.uri.UriComponent 的一部分,javadoc 在 这里。虽然你可能不想要所有的 Jersey,但它是 Jersey common package 的一部分,依赖关系不太严重...

2

I solved the problem like this

public static String getUrlParameterValue(String url, String paramName) {
String value = "";
List<NameValuePair> result = null;

try {
    result = URLEncodedUtils.parse(new URI(url), UTF_8);
    value = result.stream().filter(pair -> pair.getName().equals(paramName)).findFirst().get().getValue();
    System.out.println("-------------->  \n" + paramName + " : " + value + "\n");
} catch (URISyntaxException e) {
    e.printStackTrace();
} 
return value;

}


1
假设URL语法将始终为 http://www.youtube.com/watch?v= ...
String v = "http://www.youtube.com/watch?v=_RCIP6OrQrE".substring(31);

或者忽略前缀语法:

String url = "http://www.youtube.com/watch?v=_RCIP6OrQrE";
String v = url.substring(url.indexOf("v=") + 2);

@smonff,你是什么意思? - rtheunissen
我的意思是,我欣赏您的回答的简洁明了 :-D。 - smonff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接