2011-01-21 74 views
14

我希望我的某项活动能够获取特定网址。该模式是:Android - 匹配url模式?

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

路径组件 “ABC123” 和 “xyz789” 可以是字母数字的任何序列,长度> 1.

在我的清单这样做:

<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/.*" /> 

但似乎从我的域中的任何模式得到匹配,即:

myexample.com 
myexample.com/whatever 

都得到匹配。我想也许这个。*操作符不能像我期望的那样工作?任何帮助将是巨大的,

感谢

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

回答

1

问题是,*匹配一切,-and nothing-,所以 “/.*/” 匹配 “//”,相当于只在路径中“/”。

另外,您可以确保示例中的两个路径段“abc123”与此处支持的表达式匹配器相等。

换句话说,你想要改变你的路径,以更简单的,可以匹配。如果它是你的组件接收意图,你可以传递一个假的URL,它只是真实URL的可变部分。例如,如果你想匹配,

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

其中的两个摄像组是平等的,只是通过http://mystuff/abc123的意图,并且数据模式设置为http://mystuff/ *

然后解析:当您收到意图,并通过填充已知的常量部分将其转换为真实的URL。

+0

您好,感谢您的信息,这两个群体将是不同的(更新Q可反映)。我们可以使用。+运算符吗?这似乎仍然匹配everthing:pattern =“/.+/foo/.+” – user291701 2011-01-21 22:40:47

+0

您引用的文档没有提及“。+”。 – 2011-01-21 22:55:18

12

由于Android OS使用PatternMatchersource code和文档观察它只能与工作.*\\(转义字符),我们可能需要一点创意 - 即使用\\停止正则表达式的评估,然后从再恢复向前。

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

将只匹配myexample.com/whatever,而不是myexample.com

要与URI的像

样品溶液最终变化的URI使用/创建不同的意图过滤器,使用HTTP :// WWW .example.com/abc123/foo/xyz789/而不是http://www.example.com/abc123/foo/xyz789然后使用

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

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

例子。COM/ABC123 /富/ xyz789 /酒吧/ uvx456/android:pathPattern=".*\\/foo/.*\\/bar/.*\\/

29

今天我有同样的问题,我的解决办法是:

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

使用(。*)为(+)。

更换

在原来的问题的情况下,我想这可以工作:

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