2011-01-21 10 views
14

Vorrei una delle mie attività per raccogliere un determinato URL. Lo schema è:Android: corrisponde a un pattern URL?

http://www.example.com/abc123/foo/xyz789 

Il componenti del percorso "abc123" e "xyz789" può essere una qualsiasi sequenza di caratteri alfanumerici, lunghezza> 1.

Fare questo nel mio manifesto:

<activity> 
    <intent-filter> 
    <action 
     android:name="android.intent.action.VIEW" /> 
    <category 
     android:name="android.intent.category.DEFAULT" /> 
    <category 
     android:name="android.intent.category.BROWSABLE" /> 

    <data 
     android:scheme="http" 
     android:host="example.com" 
     android:pathPattern="/.*/foo/.*" /> 

ma sembra che qualsiasi modello dal mio dominio è sempre abbinato, vale a dire:

myexample.com 
myexample.com/whatever 

entrambi ottenere abbinati. Suppongo che forse l'operatore. * Non funzioni come mi aspetto qui? Qualsiasi aiuto sarebbe grande,

Grazie

http://developer.android.com/guide/topics/manifest/data-element.html

risposta

1

Il problema è che. * Corrisponde a tutto ciò, -e niente-, così "/.*/" partite "//", che è equivalente solo "/" in un percorso.

Inoltre, è possibile garantire che i due segmenti di percorso "abc123" nell'esempio siano uguali a quello dell'espressione supportato qui.

in altre parole, si desidera che si desideri modificare i percorsi con qualcosa di più semplice che possa essere abbinato. se è il tuo componente che sta ricevendo l'intento, puoi passare un URL falso che è solo la parte variabile dell'URL reale. per esempio, se si desidera far corrispondere,

http://www.example.com/.+/foo/.+ 

in cui i due gruppi catturati sono uguali, basta passare http://mystuff/abc123 nell'intento, e impostare il modello di dati di http://mystuff/ *

quindi analizzare che quando si riceve il intento e trasformarlo nell'URL reale compilando le parti costanti conosciute.

+0

Ciao, grazie per le informazioni, i due gruppi sarà diverso (aggiornato Q per riflettere). Possiamo usare l'operatore. +? Questo sembra corrispondere ancora a tutto: pattern = "/.+/ foo /.+" – user291701

+0

i documenti che hai citato non menzionano ". +". –

12

Dal sistema operativo Android utilizza PatternMatcher e osservando da source code e la documentazione può funzionare solo con .* e \\ (caratteri di escape) potremmo aver bisogno di essere un po 'creativo - vale a dire, utilizzare \\ per fermare la valutazione regex e poi riprendere da allora poi.

<data 
       android:host="example.com" 
       android:pathPattern=".*\\/foo/.*" 
       android:scheme="http"/> 

che corrisponderà solo myexample.com/whatever e non myexample.com

Per creare diversi filtri intento con vari uso uri / alla fine degli uri come

soluzione del campione, utilizzare http: // www .example.com/abc123/foo/xyz789/ anziché http://www.example.com/abc123/foo/xyz789 e quindi utilizzare

example.com/abc123/~~V~~3rd android:pathPattern=".*\\/

example.com/abc123/foo/xyz789/ android:pathPattern=".*\\/foo/.*\\/

esempio.com/abc123/foo/xyz789/bar/uvx456/android:pathPattern=".*\\/foo/.*\\/bar/.*\\/

29

Ho avuto lo stesso problema di oggi, la mia soluzione era:

<data android:pathPattern="/remotes/..*/..*"/> 

usando (.. *) in sostituzione di (+).

Nel caso della domanda originale immagino che questo può funzionare:

<data 
       android:host="example.com" 
       android:pathPattern="..*/foo/..*" 
       android:scheme="http"/> 
+1

Questo è molto prezioso. .. * corrisponde a 1 o più occorrenze di qualsiasi personaggio. – xeed

+0

Grazie mille! Questo è esattamente quello che stavo cercando! :) –

Problemi correlati