Domanda

Noi tenere traccia di stringhe user agent nel nostro sito. Voglio fare alcune statistiche su di loro, per vedere quanti utenti IE6 abbiamo (quindi sappiamo cosa dobbiamo sviluppare contro), e anche il numero di utenti di telefonia mobile che abbiamo.

Quindi dobbiamo entires di log in questo modo:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)

E idealmente, sarebbe abbastanza carino per vedere tutte le stringhe 'significative', che sarebbe solo significare probabilmente le stringhe più lunghe di una certa lunghezza. Per esempio, potrei piacerebbe vedere quante voci hanno FunWebProducts in essa, o .NET CLR, o .NET CLR 1.0.3705 - ma Non voglio vedere quanti hanno un punto e virgola. Quindi non sto necessariamente alla ricerca di stringhe univoche, ma tutte le stringhe, anche i sottoinsiemi. Quindi, vorrei vedere il conteggio di tutti Mozilla, sapendo che questo include i conteggi per Mozilla/5.0 e Mozilla/4.0. Sarebbe bello se ci fosse un display nidificato per questo, a partire con le corde più brevi, e lavorando la sua strada verso il basso. Qualcosa forse come

4,2093 Mozilla
 1,093 Mozilla/5.0
    468 Mozilla/5.0 (Windows;
     47 Mozilla/5.0 (Windows; U 
 2,398 Mozilla/4.0

Questo suona come un compito di informatica. Cosa sarebbe questo essere chiamato? Ha qualcosa di simile esiste là fuori, o faccio a scrivere il mio?

È stato utile?

Soluzione

Si sta guardando un più lunga comuni problema, o, dato il vostro esempio specifico di cui sopra, un problema comune prefisso più lungo, che può essere affrontata con un trie .

Tuttavia, andando dal vostro esempio di cui sopra, probabilmente non hanno nemmeno bisogno di essere efficiente su questo. Invece, semplicemente:

  1. stringhe tokenize su alcuni segni di punteggiatura sottoinsieme, come [ ;/]

  2. Salva ogni prefisso unico di tuttavia molti gettoni, sostituendo i delimitatori originali

  3. Per ogni prefisso, ottenere un conteggio di che registra che corrisponda e risparmiare che

Altri suggerimenti

Se suddividerlo in nome importante (parte prima che la parentesi di apertura), e quindi memorizzare ogni parte separati da virgola come un record figlio, si poteva fare tutto quello che vuoi analisi. Ad esempio, conservarlo in un database relazionale:

BrowserID   BrowserText
---------   -----------
1           Mozilla/4.0
2           Mozilla/5.0

FeatureID   FeatureText
---------   -----------
1           compatible
2           MSIE 7.0
3           Windows NT 5.1
4           FunWebProducts
5           .NET CLR 1.0.3705
6           .NET CLR 1.1.4322
7           Media Center PC 4.0
8           .NET CLR 2.0.50727

Quindi accedere riferimenti al browser e le parti e si può fare qualsiasi tipo di analisi che si desidera.

Cosa succede ad usare una regex per analizzare la stringa user agent nelle sue parti componenti rilevanti? Le specifiche di base per una stringa user agent è '[name] / [version]' o '[name] [version]'. Con queste informazioni possiamo usare un'espressione regolare come ([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+)) per arrivare set match dove la prima partita in un insieme è il [name] e la seconda partita in un set è il [version]. Naturalmente, si dovrà mettere a nudo gli spazi e / dalla seconda partita nel set, o modificare l'espressione regolare da utilizzare lookbehind (che vari gusti regex non supportano, quindi non ho incluso qui).

Dopo aver ottenuto tutte queste tuple è possibile manipolare e contarli tuttavia si desidera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top