PHP正则表达式用于处理浏览器代理字符串

4

我需要您再次帮助我翻译一些正则表达式的内容(我还在努力学习中)。

我正在尝试通过解析用户代理来学习,现在正在尝试解析Firefox...

请考虑以下这些用户代理:

 - Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.15) Gecko/2009101601 Firefox 2.1 (.NET CLR 3.5.30729)
 - Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.20) Gecko/20081217 Firefox(2.0.0.20)
 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.1b3;MEGAUPLOAD 1.0 (.NET CLR 3.5.30729)
 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100306 Firefox3.6 (.NET CLR 3.5.30729)
 - Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081202 Firefox (Debian-2.0.0.19-0etch1)
 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)
 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.13) Gecko/20080313 Firefox

我正在尝试编写一个正则表达式,以从UA中提取Firefox版本。
以下是我想要的规则:
1. 版本号始终在"firefox"字符串之后("Firefox"可以是任何字符大小写)。
2. 版本字符串可以直接跟在"/"或空格后面,也可以以"("开头,甚至可以没有任何字符。
3. 版本字符串以空格或字符串结尾、闭合括号或分号结束。
4. 在一些罕见的情况下,可能没有提供版本号(请参见最后一个UA)。正则表达式必须匹配,但返回一个空字符串作为版本号(如果可能)。
以上就是所有规则。如果有人能帮忙,那就太好了!

你熟悉PHP的get_browser函数吗?http://php.net/manual/zh/function.get-browser.php - nikc.org
3个回答

5

像这样应该可以工作:

/Firefox[ \(\/]*([a-z0-9\.\-]+)/i

3
对于#4,将“+”更改为“*”,像这样:/Firefox[ \(\/]*([a-z0-9\.\-]*)/i - casablanca
它对我来说失败了#5,匹配Debian-2.0.0.19-0etch1。不知道这是否是OP想要的。我的根本没有匹配成功:S - alex
@alex:是的,这就是我想要的(我发布了最奇怪的UA,因为常规的UA很容易解析)。 - Activist
发现另一个问题。我如何在字符串中的最后一个出现的“firefox”上应用您的正则表达式? - Activist
1
@Activist:获取最后一个匹配的简单方法就是在正则表达式的开头添加“.*”。 - Anon.

0
根据您想要实现的目标,匹配 Gecko 可能比匹配 Firefox 更明智。但这也意味着它将匹配基于 Mozilla 的 Gecko 引擎而非 Firefox 浏览器的其他浏览器(但这可能是期望的行为)。
#Mozilla/.*\bGecko/\d+#

0

以下内容将匹配您提供的所有内容:

#^Mozilla/.*\bFirefox\b#

这意味着:

“匹配以“Mozilla /”开头的任何字符串,后跟任何字符,然后是“Firefox”作为单个词。

在这种情况下,“\ b”单词中断强制执行在单词和非单词字符之间的边界匹配。不知道是否必要,但它将防止在另一个单词中出现的Firefox(例如“MyFirefox”或“Firefoxy”)上进行匹配。

**我喜欢在我的正则表达式周围使用哈希而不是斜杠,因为我经常需要匹配斜杠,这使我更少混淆。*


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