2011-05-21 16 views
13

Estoy leyendo de la historia, y quiero que cuando encuentre una consulta de google, pueda extraer la cadena de consulta. No estoy usando request o httputility ya que simplemente estoy analizando una cadena. sin embargo, cuando me encuentro con las direcciones URL como esta, mi programa no puede analizar correctamente:extraer cadena de consulta de una cadena de URL

http://www.google.com.mt/search?client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&channel=s&hl=mt&source=hp&biw=986&bih=663&q=hotmail&meta=&btnG=Fittex+bil-Google

lo que yo estaba tratando de hacer es conseguir el índice de q = y el índice de & y tomar las palabras entre pero en este caso el índice de & será más pequeño que q = y me dará errores.

alguna sugerencia?

gracias por sus respuestas, todas parecen buenas :) p.s. No podría usar httputility, no no quiero hacerlo. cuando agrego una referencia a system.web, ¡httputility no está incluido! solo está incluido en una aplicación asp.net. Gracias de nuevo

+0

Así que busque y que se encuentra inmediatamente después de q ..... Para –

+0

incluye 'HttpUtility', solo necesitas agregar una referencia al ensamblado' System.Web' en tu proyecto. No tiene que ser una aplicación asp.net. –

Respuesta

21

No está claro por qué no se desea utilizar HttpUtility.Siempre se puede añadir una referencia a System.Web y utilizarla:

var parsedQuery = HttpUtility.ParseQueryString(input); 
Console.WriteLine(parsedQuery["q"]); 

Si eso no es una opción, entonces tal vez este enfoque ayudará a:

var query = input.Split('&') 
       .Single(s => s.StartsWith("q=")) 
       .Substring(2); 
Console.WriteLine(query); 

Se divide en & y busca el resultado de división única que comienza con "q=" y toma la subcadena en la posición 2 para devolver todo después del signo =. La suposición es que habrá una sola coincidencia, lo que parece razonable para este caso, de lo contrario se lanzará una excepción. Si ese no es el caso, entonces reemplazar Single con Where, bucle sobre los resultados y realizar la misma operación subcadena en el bucle.

EDIT: para cubrir el escenario mencionado en los comentarios de esta versión actualizada se puede utilizar:

int index = input.IndexOf('?'); 
var query = input.Substring(index + 1) 
       .Split('&') 
       .SingleOrDefault(s => s.StartsWith("q=")); 

if (query != null) 
    Console.WriteLine(query.Substring(2)); 
+0

Esto, también, se producirá un error cuando la dirección URL contiene' 'Y en el camino parte . Por ejemplo, 'http: //example.com/ugly&but&legal&url&q=1234? Q = 5678'. –

+0

@Jim actualizado. Gracias por la respuesta. –

6

Si no desea usar System.Web.HttpUtility (así poder usar el perfil del cliente), aún puede usar Mono HttpUtility.cs que es solo un archivo .cs independiente que puede incrustar en su aplicación. Luego puede simplemente usar el método ParseQueryString dentro de la clase para analizar correctamente la cadena de consulta.

2

Si realmente necesita para hacer el análisis de sí mismo, y sólo está interesado en el valor de 'q', entonces el siguiente funcionaría:

 string url = @"http://www.google.com.mt/search?" + 
      "client=firefoxa&rls=org.mozilla%3Aen-" + 
      "US%3Aofficial&channel=s&hl=mt&source=hp&" + 
      "biw=986&bih=663&q=hotmail&meta=&btnG=Fittex+bil-Google"; 

     int question = url.IndexOf("?"); 
     if(question>-1) 
     { 
      int qindex = url.IndexOf("q=", question); 
      if (qindex > -1) 
      { 
       int ampersand = url.IndexOf('&', qindex); 
       string token = null; 

       if (ampersand > -1) 
        token = url.Substring(qindex+2, ampersand - qindex - 2); 
       else 
        token = url.Substring(qindex+2); 

       Console.WriteLine(token); 
      } 
     } 

Pero trato de buscar en el uso de un analizador URL adecuado, te ahorrará muchas molestias en el futuro.

(modificado esta pregunta para incluir un cheque por el token '?', Y apoyar los valores 'Q' al final de la cadena de consulta (sin el '&' al final))

+0

Eso va a fallar cuando hay q "q =" o un signo de unión en la parte de la ruta de la url. Me gusta esto: http://www.example.com/testo/thisq=99&xyzzy/hello?q=99. Sí, eso es legal. Primero tiene que encontrar el indicador de cadena de consulta ('?') Y basar todo lo demás a partir de eso. –

+0

¡Muy cierto! Enmendaré la respuesta. –

3

¿Por qué no t usted crea un código que devuelve la cadena del q= en adelante hasta el siguiente &?

Por ejemplo:

cadena s = historyString.Substring (url.IndexOf ("q ="));

int newIndex = s.IndexOf ("&");

cadena newString = s.Substring (0, newIndex);

Saludos

+1

y luego ver que falle cuando se presenta con 'http: //www.example.com/testo/thisq=99&xyzzy/hello q = 99' –

2

utilizar las herramientas disponibles:

String UrlStr = "http://www.google.com.mt/search?client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&channel=s&hl=mt&source=hp&biw=986&bih=663&q=hotmail&meta=&btnG=Fittex+bil-Google"; 

NameValueCollection Items = HttpUtility.ParseQueryString(UrlStr); 

String QValue = Items["q"]; 
1

HttpUtility está muy bien para el .Net Framework . Sin embargo, esa clase no está disponible para aplicaciones WinRT. Si desea obtener los parámetros de una url en una aplicación de Windows Store, debe usar WwwFromUrlDecoder. Usted crea un objeto de esta clase con la cadena de consulta de la que desea obtener los parámetros, el objeto tiene un enumerador y admite también expresiones lambda.

He aquí un ejemplo

var stringUrl = "http://localhost/?name=Jonathan&lastName=Morales"; 
var decoder = new WwwFormUrlDecoder(stringUrl); 
//Using GetFirstByName method 
string nameValue = decoder.GetFirstByName("name"); 
//nameValue has "Jonathan" 

//Using Lambda Expressions 
var parameter = decoder.FirstOrDefault(p => p.Name.Contains("last")); //IWwwFormUrlDecoderEntry variable type 
string parameterName = parameter.Name; //lastName 
string parameterValue = parameter.Value; //Morales 

También puede ver http://www.dzhang.com/blog/2012/08/21/parsing-uri-query-strings-in-windows-8-metro-style-apps

4

Aquí está la solución -

string GetQueryString(string url, string key) 
{ 
    string query_string = string.Empty; 

    var uri = new Uri(url); 
    var newQueryString = HttpUtility.ParseQueryString(uri.Query); 
    query_string = newQueryString[key].ToString(); 

    return query_string; 
} 
Cuestiones relacionadas